2013年省赛A组蓝桥杯试题--错误票据
题目描述:题目描述
某涉密单位下发了某种票据,并要在年终全部收回。 每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。 因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。 你的任务是通过编程,找出断号的ID和重号的ID。 假设断号不可能发生在最大和最小号。
输入
要求程序首先输入一个整数N(N< 100)表示后面数据行数。 接着读入N行数据。 每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000),请注意行内和行末可能有多余的空格,你的程序需要能处理这些空格。 每个整数代表一个ID号。
输出
要求程序输出1行,含两个整数m n,用空格分隔。 其中,m表示断号ID,n表示重号ID
样例输入
2
5 6 8 11 9
10 12 9样例输出
7 9
只是一道蓝桥杯真题,出自13年省赛A组试题。难度也并不大,代码也可以写的比较简洁又不失逻辑,最重要的是易懂,不多blabla。直接上代码。
#include<iostream>
using namespace std;
int a[100000];//建立全局数组,默认存储0值
int main()
{
int n;
cin >> n;
int x;
while (cin >> x)//以票据号为索引,所存值为该票据的张数,通过数组的索引与value建立起了联系。
{
a[x]++;
}
int begin, duan, chong;
//下面的循环是为了找到票据的第一张
for (begin = 0; begin < 100000; begin++)
{
if (a[begin]!=0)
break;
}
bool flag1 = true, flag2 = true;
//定义俩bool量,方便以下循环到合适的时机break,提高效率
for (; (flag1 || flag2) && begin < 100000; begin++)
{
if (a[begin] == 0)
{
flag1 = false;
duan = begin;
}
if (a[begin] == 2)
{
flag2 = false;
chong = begin;
}
}
cout << duan << " " << chong << endl;
system("pause");
return 0;
}