1204. 错误票据

https://www.acwing.com/problem/content/1206/

模拟题,但是输入方式有点恶心
可以用EOF方式读入,也可以用sstream读入
sstream可以参考这份

做法也有两种,可以定义bool数组遍历a[i],寻找被赋值两次的st[i]的重号,以及st[i]值为0的断号
或是简单sort一遍,直接遍历满足a[i]=a[i-1]即为重号,满足a[i]==a[i-1]+2即为断号

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
const int N = 100010;
int n,flag1,flag2;
bool st[N];
int a[N];
int num;

//做法1
int main()
{
	cin >> n;
	int i=0;
	while(cin >> a[i++])num++;
	//重号
	//利用布尔数组判断最初全为假的时候,是否有ID有过赋值导致其布尔值为1;
	for(int i=0;i<num;i++)
	{
		if(st[a[i]])flag1=a[i];
		st[a[i]]=1;
	}
	int start=0;
	while(!st[start])start++;
	//断号
	//布尔数组中为假即为不存在的断号
	for(int i=start;i<start+num;i++)
		if(!st[i])flag2=i;
	cout << flag2 << ' ' << flag1 << endl;
	return 0;
}


//做法2
int main()
{
	cin >> n;
	int i=0;
	while(cin >> a[i++])num++;
	sort(a,a+num);
	for(int i=1;i<num;i++)
	{
		if(a[i]==a[i-1])flag1=a[i];
		else if(a[i] == a[i-1]+2)flag2=a[i]-1;
	}
	cout << flag2 << ' ' << flag1 << endl;
	return 0;
}

 

posted @ 2022-10-05 12:09  风乐  阅读(20)  评论(0)    收藏  举报