版权声明:IT交流QQ群328880248,欢迎大家来一起学习一起交流~本篇文章未经同意请勿转载! https://blog.csdn.net/m0_38072683/article/details/88092253
问题 A: 小P参加相亲大会
时间限制: 2 Sec 内存限制: 16 MB
提交: 381 解决: 51
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
小P最近人生得意,去参加了一次相亲大会,相亲大会上每个人有一个密码牌(密码牌上的密码是一个正整数m,m<231 ),相互之间在交流之前先交换密码牌,密码牌上的密码可能相同,也可能不同,如果相同,两人牵手离开,如果不保同,各自再寻找下一位,保证最后只有1个人或2个人留下来。
输入
第一行两个数 n,k (n≤3000000,1≤k≤2),n表示参加相亲大会的人数,接下来 n行每行一个正整数表示相亲大会上每一个人的密码,k表示最后留在相亲大会的人数。
输出
从小到大输出一行 k个数,表示相亲不成功留在相亲大会人的密码,中间用空格分隔。
样例输入 Copy
3 1 2 2 2
样例输出 Copy
2
提示
对于40% 的数据,保证 k=1。
对于20%的数据,保证n≤100
对于100%的数据,保证 n≤3000000,ai<231。
思考
本来以为会超时,抱着试一试的心态,结果A了,但是这应该不是最优解。(如果找到之后应该立即return)
我的思路是这样的:先排序,然后两个两个判断,如果相等那就continue,否则输出那个数。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 3000000;
int a[maxn];
int main(){
int n,k;
scanf("%d%d",&n,&k);
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
//排序
sort(a, a+n);
bool flag = true;
for(int i = 0; i < n; i+=2) {
// 如果相等 那就continue
if (a[i] == a[i+1]) {
continue;
} else {
//不相等就输出,此处需要注意输出格式
if(k == 2 && flag){
printf("%d ",a[i]);
flag = false;
} else {
printf("%d\n",a[i]);
}
// i需要-1
i -= 1;
}
}
}