资源限制
时间限制: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
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
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 }