[蓝桥杯 2013 省 AB] 错误票据
题目背景
某涉密单位下发了某种票据,并要在年终全部收回。
题目描述
每张票据有唯一的 ID 号,全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造成了某个 ID 断号,另外一个 ID 重号。
你的任务是通过编程,找出断号的 ID 和重号的 ID。
数据保证断号不可能发生在最大和最小号。
输入格式
一个整数 $N(N<100)$ 表示后面数据行数,接着读入 $N$ 行数据,每行数据长度不等,是用空格分开的若干个(不大于 $100$ 个)正整数(不大于 $10^5$),每个整数代表一个 ID 号。
输出格式
要求程序首先输入要求程序输出 $1$ 行,含两个整数 $m$,$n$,用空格分隔,其中,$m$ 表示断号 ID,$n$ 表示重号 ID。
样例 #1
样例输入 #1
2
5 6 8 11 9
10 12 9
样例输出 #1
7 9
题解
#include<bits/stdc++.h>
using namespace std;
int a[10001],l;
int main()
{
int N,m,n,i;
string s;
cin>>N;
cin.ignore(numeric_limits<streamsize>::max(),'\n');
for(i=1;i<=N;i++)
{
getline(cin,s);
stringstream sin(s);
while(sin>>a[++l]);
}
sort(a+1,a+l+1);
for(i=2;i<=l;i++)
if(a[i]==a[i+1]-2) m=a[i]+1;
else if(a[i]==a[i+1]) n=a[i];
printf("%d %d\n",m,n);
return 0;
}
cin.ignore(numeric_limits[HTML_REMOVED]::max(),’\n’);:这行代码用于清空输入缓冲区,确保在读取输入之前没有残留的换行符或其他字符。
getline(cin, s);:这行代码从标准输入流中读取一行文本,并将其存储在字符串变量 s 中。
stringstream sin(s);:这行代码创建了一个字符串流 sin,它允许我们像从标准输入流一样从字符串中读取数据。
while (sin >> a[++l]);:这行代码使用 stringstream 从字符串中读取整数,并存储在数组 a 中。循环会一直读取整数,直到遇到字符串末尾。
sort(a+1,a+l+1);:这行代码对数组 a 中的元素进行排序,排序范围是从第 1 个元素到第 l 个元素。
if (a[i] == a[i+1]-2) m = a[i] + 1;:这行代码用于找出缺失的两个整数中的较小值。如果数组中相邻两个元素之间差值为2,说明有一个整数缺失,那么较小的缺失整数就是其中一个元素加1。
else if (a[i] == a[i+1]) n = a[i];:这行代码用于找出缺失的两个整数中的较大值。如果数组中相邻两个元素相等,说明有一个整数重复出现,那么较大的缺失整数就是其中一个元素。