P8598 [蓝桥杯 2013 省 AB] 错误票据

· · 题解

题目传送门

思路:

比较水的模拟,每次输入一个数 x,就将记录 x 出现了多少次的 a[x]+1,查找断号只需要从头到尾扫一遍,对于每一个 i,当 a[i-1]=1a[i+1]=1a[i]=0 时便可以判定为断号。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,x,a[100005],ans1,ans2;
signed main(){
    cin>>n;
    while(cin>>x)a[x]++;
    for(int i=1;i<=10004;i++){
        if(a[i-1]&&a[i+1]&&!a[i])ans1=i;
        if(a[i]>1)ans2=i;
        if(ans1&&ans2)break;
    }
    cout<<ans1<<" "<<ans2<<endl; 
    return 0;
}

代码中添加了一些小优化,如果断号和重号都已经判定出来了,就可以直接跳出循环。