题目描述
萌樱花是一只单身狗。
萌樱花今天在桌子上摆出了N张卡片,每张卡片i写着一个数字Ai
他不喜欢卡片上的数字多个出现,于是他想搞点事情拆分它们。
从桌子上选出三张卡,去掉一张数字最大,一张数字最小,然后留下中间那张放回桌子上,
这样的操作持续到桌子上的卡片显示的数字都是唯一的才停止。
那么最后桌子上最多可以留下多少张卡片呢?
输入
3<=N<=105
N是奇数,这样保证绝对可以留下一张
1<=Ai<=105
Ai是整数
输入格式:
N
A1 A2 A3 .....AN
输出
输出 最后桌子上能留下多少张卡
样例输入
5 1 2 1 3 7
样例输出
3
提示
我们选取1 1 2,去掉最大2,最小1,留下中间的1,最后桌子上只剩下1 3 7,一共三张卡
#include<bits/stdc++.h> using namespace std; int main() { int n; int a[200000]; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } sort(a,a+n); int x=unique(a,a+n)-a; if(x%2) { cout<<x; } else { cout<<x-1; } return 0; }
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; int a[100006]; int vis[100006]; int main() { int n; while(~scanf("%d",&n)) { memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { scanf("%d",&a[i]); vis[a[i]]++; } int j=100002; for(int i=1;i<=100002;i++) { if(vis[i]>1) { while(vis[j]<=1&&j>i)j--; if(j>i) { if(vis[i]==vis[j])vis[i]=1,vis[j]=1; else if(vis[i]>vis[j]) { vis[i]-=vis[j]-1; vis[j]=1; i--; } else if(vis[i]<vis[j]) { vis[j]-=vis[i]-1; vis[i]=1; j++; } } } } int output=0; for(int i=1;i<=100002;i++) { if(vis[i]==1)output++; if(vis[i]>1) { if(vis[i]%2==0)continue; else output++; } } printf("%d\n",output); } }
原文地址:https://www.cnblogs.com/yinghualuowu/p/9494669.html
时间: 2024-10-12 02:57:03