错误票据问题

错误票据问题

问题详情

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

每张票据有唯一的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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒜白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值