题目描述
某涉密单位下发了某种票据,并要在年终全部收回。每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。你的任务是通过编程,找出断号的ID和重号的ID。
假设断号不可能发生在最大和最小号。
输入格式
第一行包含整数 N,表示后面共有 N行数据。
接下来 N行,每行包含空格分开的若干个(不大于100个)正整数(不大于100000),每个整数代表一个ID号。
输出格式
要求程序输出1行,含两个整数 m,n,用空格分隔。其中,m表示断号ID,n表示重号ID。
数据范围
1≤N≤100
样例
输入样例:
2
5 6 8 11 9
10 12 9
输出样例:
7 9
1.
#include <iostream>
#include <cstring>
#include <cstdio>
#include <sstream>
#include <algorithm>
using namespace std;
int n;
int cnt;
int a[10005];
int main(int argc, char** argv) {
cin>>cnt;
string line;
scanf("\n");//吸收输入cnt后的那个回车,注意输入字符时一定要慎重
while(cnt--){
getline(cin,line);
stringstream ssin(line);//用到了stringstream输入流
while(ssin>>a[n]) n++;
}
sort(a,a+n);
int d,c;
for(int i=1;i<n;i++){
if(a[i]==a[i-1]) c=a[i];
if(a[i]>a[i-1]+1) d=a[i]-1;
}
cout<<d<<" "<<c<<endl;
return 0;
}
2.不一样的输入
#include <iostream>
#include <cstring>
#include <cstdio>
#include <sstream>
#include <algorithm>
using namespace std;
int n;
int cnt;
int a[10005];
int main(int argc, char** argv) {
cin>>cnt;//并没啥用,下面当成int类型一个一个输入了,不按字符输入了
int j=0,x;
while((scanf("%d",&x))!=EOF)
{
a[j]=x;
j++;
}
sort(a,a+j);
int d,c;
for(int i=1;i<j;i++){
if(a[i]==a[i-1]) c=a[i];
if(a[i]>a[i-1]+1) d=a[i]-1;
}
cout<<d<<" "<<c<<endl;
return 0;
}
3.//找了很长时间的初五,昨天心态简直爆炸啊,爆炸啊,今天才发现是因为数组数据范围开错了,啊啊 啊 啊啊 啊 啊
用st[]数组来判断某个数是否出现过,出现过就是true,否则就是false
#include <iostream>
#include <cstring>
#include <cstdio>
#include <sstream>
#include <algorithm>
using namespace std;
int a[10005];
bool st[100005];
int c,d,n;
int start;
int cnt;
int main(int argc, char** argv) {
cin>>cnt;//并没啥用,下面当成int类型一个一个输入了,不按字符输入了
string s;
getline(cin,s);
while(cnt--){
getline(cin,s);
stringstream ssin(s);
while(ssin>>a[n]) n++;
}
for(int i=0;i<n;i++){
if(st[a[i]]) c=a[i];
st[a[i]]=true;
}
while(!st[start]) start++;//找原数组中的最小值
for(int i=start;;i++){//题意说一定会有一个断的,说明不用考虑最大
if(!st[i]) {
d=i;
break;
}
}
cout<<d<<" "<<c<<endl;
return 0;
}
4.
#include <iostream>
#include <cstring>
#include <cstdio>
#include <sstream>
#include <algorithm>
using namespace std;
int cnt;//行数
int start;//数组最小值
int a[10005];
int f[100005];//记录数组a[]中每个数字元素出现的个数,害,又是卡到了数组空间大小上,少看了一个0,害的我心情从昨天晚上到现在都不好
int c,d,n;
int main(int argc, char** argv) {
cin>>cnt;//并没啥用,下面当成int类型一个一个输入了,不按字符输入了
string s;
getline(cin,s);
while(cnt--){
getline(cin,s);
stringstream ssin(s);
while(ssin>>a[n]) n++;
}
int Max=-100005,Min=100005;
for (int i = 0; i < n ;i++) {
f[a[i]]++;
if(f[a[i]]==2) c=a[i];
Max=max(Max,a[i]);
Min=min(Min,a[i]);
}
for(int i=Min;i<=Max;i++){
if(f[i]==0){
d=i;
}
}
cout<<d<<" "<<c<<endl;
return 0;
}