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;
 }

我相信代码应该是清晰易懂的,希望对各位网友有些许帮助~^_^

猜你喜欢

转载自www.cnblogs.com/yuanshixiao/p/13386972.html