题解 - 丢失的书页(C++)

题目描述

多多有一本共n页的古老书籍。某一天多多想要打开这本书时,一不小心把书页都弄散了。多多赶紧把散落在地的书页都捡了起来,可惜这些书页已经都乱了。多多想要知道有没有书页弄丢了,于是清点了一下捡到的页码。
但是多多很粗心,他很可能漏点了一些页码。考虑到相邻的两页是在同一张纸上的,即第1页和第2页在同一张纸上,第3页和第4页在同一张纸上……如果多多点到了第2页,但没点到第1页,那么他就一定是漏点了。而如果第1页和第2页都没有被多多点到,那么也有可能是这张纸真丢了。
多多想知道他最多丢了几张纸,以及他至少点漏了几页。

输入

第一行读入整数 n,m(n,m<=1000),分别表示总页数和多多点到的页数,保证n为偶数。
第二行读入m个数,表示多多点到的页码,保证互不相同。

输出

第一行输出一个整数,表示小 X 最多丢了几张纸。
第二行输出一个整数,表示小 X 至少点漏了几页。

限制

时间限制: 1.000 Sec 内存限制: 128 MB

样例

样例输入

【样例1】
6 3
4 1 3
【样例2】
10 3
1 4 6

样例输出

【样例1】
1
1
【样例2】
2
3

解题思路

“如果多多点到了第2页,但没点到第1页,那么他就一定是漏点了。而如果第1页和第2页都没有被多多点到,那么也有可能是这张纸真丢了。”

这句话是解题的关键

一张纸有且仅有两页,所以我们可以将所有的页数存到一个数组中,然后以每两个元素为一组

如果这两个元素只有一个被点到,则至少漏点的页数+1;如果这两个元素都没有被点到,则最多弄丢的张数+1。

参考代码

#include<iostream>

using namespace std;

const int N = 1000 + 10; // 防止数据溢出

int n, m;
int p[N]; // 定义数组,默认所有元素为0

int main() {
    cin >> n >> m;

    for (int i = 0; i < m; i++) {
        int tmp;
        scanf("%d", &tmp);
        p[tmp]++; // 如果这一页被点到,则数组p中用来表示该页的元素的值+1
    }

    int mx = 0, mn = 0; // mx指最多弄丢的张数,mn指最少漏点的页数
    for (int i = 1; i <= n; i += 2) { // 以每两个元素为一组    * 注意i每次要+2 *
        // 判断是否有符合题意的情况
        // 如果该页没点到,则为默认值0;如果被点到,则为1
        if (p[i] == 0 && p[i + 1] == 0) mx++;  
        else if ((p[i] == 1 && p[i + 1] == 0) || (p[i] == 0 && p[i + 1] == 1)) mn++;
    }

    cout << mx << endl << mn;

    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值