先贴个题目:
以及原题链接: 1204. 错误票据 - AcWing题库https://www.acwing.com/problem/content/1206/
其实这题原来不是很想写题解记录的,毕竟太简单了,但因为还是写了两种解法的不水一篇有点可惜了(bushi)那还是写一下吧,先讲第一个比较容易想到的思路,先开个bool数组,然后一直读入数据,下标就代表这个数,bool值代表是否出现过,然后重复true的就是重号,在true里的false就是断号,代码如下:
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
bool cnt[N] = {false};
int main()
{
int t;
cin >> t;
int num;
int m, n;
while(cin>>num)
{
if(cnt[num]==true)
n = num;
cnt[num] = true;
}
int sign = 0;
for (int i = 1; i < N;++i)
{
if(sign&&cnt[i]==false)
{
m = i;
break;
}
if(!sign&&cnt[i]==true)
sign = 1;
}
cout << m << " " << n;
return 0;
}
然后另一种做法是排序,然后找相等的两个数,和相差大于1的两个数,具体代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5;
int a[N];
int main()
{
int n;
cin >> n;
int num, b = 0;
while (cin >> num)
a[b++] = num;
sort(a, a + b);
int x, y;
for (int i = 0; i < b - 1; ++i)
{
if (a[i + 1] - a[i] == 0)
y = a[i];
if (a[i + 1] - a[i] > 1)
x = a[i + 1] - 1;
}
cout << x << " " << y;
return 0;
}
嗯,就这样 ,so easy。
by————2024.2.28刷题记录