AcWing 1204. 错误票据
原题链接
简单
作者:
Bear_King
,
2021-01-16 08:26:16
,
所有人可见
,
阅读 274
错误票据
本题关键在数据输入的模式
将cnt行不确定个数的数据整合到一个数组里,然后排序,再遍历扫一下即可
#include <iostream>
#include<algorithm>
#include <sstream>//stringstream的头文件
using namespace std;
const int N=10010;
int a[N];
int n;
int main()
{
int cnt;
cin>>cnt;
string line;
getline(cin,line);//忽略掉第一行的回车,否则造成第一次输入吃掉换行结束掉
/*
由于 getline() 并不忽略行开头的换行符,
只要 getline() 遇到换行符,
哪怕是第一个字符,getline()
也会将它作为本次输入的字符串结束符
*/
while(cnt --)
{
getline(cin,line);//复制line到stringstream ss
stringstream ssin(line);//定义的stringstream类的对象
while(ssin >> a[n]) n++;//将line通过ssin复制粘贴到a数组
}
sort(a,a + n);
int res1,res2;
for(int i = 1;i < n;i ++)
if(a[i] == a[i - 1]) res2 = a[i]; //重号
else if(a[i] >= a[i - 1] + 2) res1 = a[i] - 1;//可以婉转一下,防止数组越界
cout << res1 << ' ' << res2 << endl;
//for(int i = 0;i < n;i ++) cout<<a[i]<<" ";
return 0;
}
当然,还可以用桶排序直接枚举
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110, M = 100010, INF = 10000000;
//数组vle存入值M出现的次数
int vle[M];
int main(){
int line, m, n, i;
int v, minv = INF, maxv = -INF;
cin >> line;
while(line --){
while(cin >> v){
minv = min(minv, v);//更新最小值
maxv = max(maxv, v);//更新最大值
vle[v] ++;
}
}
//断号出现0次即i ==0,重号出现2次即i == 2
for(int i = minv; i <= maxv; i ++){
if(vle[i] == 0) m = i;
if(vle[i] == 2) n = i;
}
cout << m << ' ' << n;
return 0;
}