错误票据问题
问题详情
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的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
问题分析
对于题目中的数据,我们可以知道本来正确的数字是连续的数字,未知的变量是起始的数字,以及数据的长度。但是错误的数字串是有一个数字缺失,有一个数字重复
应对策略
设置一个 cnt 数组,每输入一个数字 x 就进行 cnt [ x ] ++ 操作,同时为了简化计算过程 ,我们在这里可以 统计出 输入的最小值,最大值。
代码
#include<iostream>
using namespace std;
const int N = 1e5+7;
int cnt[N],n;
int main(){
cin>>n;
int x;
int max_x=0;
int min_x=N;
while(cin>>x){
//这里就是 cin 操作的简便性了,忽略掉空格和换行符
cnt[x]++;
max_x=max(max_x,x);
min_x=min(min_x,x);
}
int res,ans;
for(int i=min_x;i<=max_x;i++){
if(cnt[i]==0) res=i;
if(cnt[i]==2) ans=i;
}
cout<<res<<' '<<ans;
return 0;
}