题目描述
多多有一本共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;
}