zoukankan      html  css  js  c++  java
  • 试题 历届试题 错误票据

    资源限制
    时间限制:1.0s   内存限制:256.0MB
     
    问题描述

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

    每张票据有唯一的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
     
    样例输入2
    6
    164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
    172 189 127 107 112 192 103 131 133 169 158
    128 102 110 148 139 157 140 195 197
    185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
    149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
    113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119
     
    样例输出2
    105 120
     
     
    这题显然要用到字符串,因为每行输入的数的个数是随机的,那就是要输入字符串然后一个个转换成数字存到数组里,还要处理多余的空格,然后数组排序,找出断号ID和重号ID.
    起先我用getline()函数读取一行,但是出了点问题,然后发现是忘了处理输入了N之后的那个换行,于是getline()读取的第一行变成了那个换行符,这时它以为第一行结束了,读到的就是一个空的字符串,这样一来就会漏读了一行,在读入了N之后用cin.get()吃掉那个换行符就好了. 不过循环里面用getline()读取一行之后的那个换行符就不需要这样处理了,因为getline()就是用换行符来确认一行的结尾,它将丢弃读到的那个换行符.
     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <string>
     6 #include <cmath>
     7 #include <algorithm>
     8 #define INF 0x3f3f3f3f
     9 #define zero 1e-7
    10 
    11 using namespace std;
    12 typedef long long ll;
    13 const ll mod=50000;
    14 const ll max_n=1e5+7;
    15 
    16 string s;
    17 int a[max_n]={0};
    18 
    19 int main() {
    20     int N, m, n, cnt=0;//m断号ID,n重号ID 
    21     cin>>N;
    22     cin.get();//吃回车 
    23     while(N--) {
    24         s="";
    25         getline(cin, s);
    26         int len=s.length();
    27         for(int i=0; i<len; i++) {
    28             if(s[i]>='0' && s[i]<='9') {
    29                 if(i!=0 && s[i-1]==' ') cnt++;//处理多余的空格 
    30                 a[cnt]=a[cnt]*10+s[i]-'0';
    31             }
    32         }
    33         cnt++;
    34     }
    35     sort(a, a+cnt);
    36     for(int i=1; i<cnt; i++) {
    37         if(a[i]-a[i-1]<1) n=a[i];
    38         if(a[i]-a[i-1]>1) m=a[i]-1;
    39     }
    40     cout<<m<<" "<<n<<endl;
    41     return 0;
    42 }  
     
    我又百度了一下,发现原来可以更简单,根本不用字符串,直接当成一个个整数输入就好了,因为官网上的测试用例的输入是用的文件形式,那么直接读到文件末尾就好了,自己电脑上的话,输入数据之后手动Ctrl+Z然后回车就能结束输入了,结果就出来了,如下图所示——
     
     
    网站上的测试用例是用的文件,以后要注意一下这点了,指不定会省事不少呢.
     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <string>
     6 #include <cmath>
     7 #include <algorithm>
     8 #define INF 0x3f3f3f3f
     9 #define zero 1e-7
    10 
    11 using namespace std;
    12 typedef long long ll;
    13 const ll mod=50000;
    14 const ll max_n=1e5+7;
    15 int a[max_n];
    16 
    17 int main() {
    18     int N, m, n, cnt=0;//m断号ID,n重号ID 
    19     cin>>N;
    20     while(cin>>a[cnt]) cnt++;
    21     sort(a, a+cnt);
    22     for(int i=1; i<cnt; i++) {
    23         if(a[i]-a[i-1]<1) n=a[i];
    24         if(a[i]-a[i-1]>1) m=a[i]-1; 
    25     }
    26     cout<<m<<" "<<n<<endl;
    27     return 0;
    28 }  
  • 相关阅读:
    window.location 对象所包含的属性
    控制器如何获取一条url中存在多个Id
    js 生成GUID
    JS控制前端控件的显示与隐藏
    ASP.NET CORE根据后台数值在razor页面进行判断单选按钮选中
    Selectize 控件使用以及js执行文件的时间差问题
    理解css中的position属性
    本地预览的vue项目,在githubpage静态展示
    关于img底部空白
    [优化]Steamroller-freecodecamp算法题目
  • 原文地址:https://www.cnblogs.com/wwqzbl/p/13565529.html
Copyright © 2011-2022 走看看