蓝桥杯练习系统历届试题 错误票据

问题描述

某涉密单位下发了某种票据,并要在年终全部收回。

每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。

因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。

你的任务是通过编程,找出断号的ID和重号的ID。

假设断号不可能发生在最大和最小号。

输入格式

要求程序首先输入一个整数N(N<100)表示后面数据行数。

接着读入N行数据。

每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000),请注意行内和行末可能有多余的空格,你的程序需要能处理这些空格。

每个整数代表一个ID号。

输出格式

要求程序输出1行,含两个整数m n,用空格分隔。

其中,m表示断号ID,n表示重号ID

样例输入1
2
5 6 8 11 9 
10 12 9
样例输出1
7 9
 
超级水的水题,然而第一次直接用scanf("%d", &num);处理空格的时候TLE了。然后换成gets(s);第一次WA了50%数据吧。因为找loseans的时候出现了点问题。按照我的思路,找这两个答案是有顺序的说。【反正就是笨笨的我在除了输入之外的那个找loser也卡了T_T】
附right代码:
  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <iostream>
  4 #include <algorithm>
  5 #define inf 1000000000
  6/span> using namespace std;  7 
 8 char str[1010];  9 int num[210];  10 
 11 int main()  12 {  13     int temp;  14     int n, cnt, cans, lans;  15     while(~scanf("%d", &n))  16  {  17  getchar();  18         cnt = 0;  19 
 20         while(n--)  21  {  22             temp = inf;  23  gets(str);  24             int len = strlen(str);  25             for (int i=0; i<len; ++i)  26  {  27                 if (str[i] == ' ' && temp != inf)  28  {  29                     num[cnt++] = temp;  30                     temp = inf;  31  }  32                 else if (str[i] >= '0' && str[i] <= '9')  33  {  34                     if (temp == inf)  35  {  36                         temp = str[i] - '0';  37  }  38                     else temp = temp * 10 + str[i] - '0';  39  }  40                 if (i == len-1 && temp != inf)  41  {  42                     num[cnt++] = temp;  43                     temp = inf;  44  }  45  }  46  }  47        /* int k;  48  for(int i=0; i<n; i++)  49  {  50  gets(str);//用gets可以输入空格  51  //可以边输入边判断  52  int len=strlen(str);  53  for(int j=0; j<len; j++)  54  {  55  if(str[j]>='0'&&str[j]<='9')  56  {  57  int now=0;  58  for(k=j; str[k]!=' '&&k<len; k++)  59  //注意k也要在字符串长度之内  60  {  61  now=now*10+str[k]-'0';  62  }  63  num[cnt++]=now;  64  j=k;  65  }  66  }  67  }*/
 68 
 69         sort(num, num+cnt);  70         int id;  71 
 72         for (int i=0; i<cnt-1; ++i)  73  {  74             if (num[i] == num[i+1])  75  {  76                 cans = num[i];  77                 id = i;  78                 break;  79  }  80  }  81 
 82         lans = inf;  83 
 84         for (int i=0; i<id; ++i)  85  {  86             if (num[i] != num[0] + i)  87  {  88                 lans = num[0] + i;  89                 break;  90  }  91  }  92 
 93         if (lans == inf)  94  {  95             for (int i=id+1, j=0; i<cnt; ++i, ++j)  96  {  97                 if (num[i] != cans+j)  98  {  99                     lans = cans+j; 100                     break; 101  } 102  } 103  } 104         cout << lans << " " << cans << endl; 105  } 106     return 0; 107 }
View Code

额。交完又发现别人家的代码就是长得好看啊~~~

这样多机智,为什么我一定要写的那么抽捏~~~【字符串处理成数组的时候】

   /* int k;
        for(int i=0; i<n; i++)
        {
            gets(str);//用gets可以输入空格
            //可以边输入边判断
            int len=strlen(str);
            for(int j=0; j<len; j++)
            {
                if(str[j]>='0'&&str[j]<='9')
                {
                    int now=0;
                    for(k=j; str[k]!=' '&&k<len; k++)
                        //注意k也要在字符串长度之内
                    {
                        now=now*10+str[k]-'0';
                    }
                    num[cnt++]=now;
                    j=k;
                }
            }
        }*/

  

你可能感兴趣的:(蓝桥杯练习系统历届试题 错误票据)