zl程序教程

您现在的位置是:首页 >  后端

当前栏目

[第四届蓝桥杯省赛C++A/B组]错误票据

C++错误 蓝桥 省赛 第四届
2023-09-11 14:18:49 时间

来源: 第四届蓝桥杯省赛C++A/B组

算法标签:排序,模拟

题目描述

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

每张票据有唯一的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

C++ 代码

思路

看题目本身只是在数组当中找出重号和缺号,我们只需要排序一下就行了。
难点在于字符串的读入处理上面。

字符串;
#include<iostream>
#include<cstring>
#include<algorithm>
#include<sstream>

using namespace std;
const int N=1e5+10;
int a[N];
int n;

int main()
{
    int cnt;
    cin>>cnt;
    
    string line;
    getline(cin,line);
    while(cnt--)// 忽略掉第一行的回车
        {
           getline(cin,line);//读入一行
           stringstream ssin(line);//给入ssin
           while(ssin>>a[n])n++;//放入数组
        }
    sort(a,a+n);
    int an1,an2;
    for(int i=1;i<=n;i++)
        {
            if(a[i]-a[i-1]>=2)an1=a[i]-1;// 断号
            else if(a[i]-a[i-1]==0)an2=a[i];// 重号
        }
    cout<<an1<<" "<<an2;
    return 0;
}
数字读入,桶排序想法;

利用桶排序的思想,记录所有数组出现的次数。

#include<iostream>

using namespace std;
const int N=1e5+10;
int a[N];

int main()
{
    int cnt;
    cin>>cnt;
    
    int t;
    int maxv=-N,minv=N;
    while(cnt--)
        {
            while(cin>>t)
               {
                    a[t]++;
                    maxv=max(maxv,t);
                    minv=min(minv,t);
                }
        }
    int an1,an2;
    for(int i=minv;i<=maxv;i++)
            if(!a[i])an1=i;
            else if(a[i]==2)an2=i;
    cout<<an1<<" "<<an2;
    return 0;
}