题目描述
有2N张牌,它们的点数分别为1到2N。Alice拿了其中的N张,Bob拿了剩下的N张. Alice和Bob会进行N轮游戏,在每轮游戏中,Alice 和Bob 各出一张牌。出了的牌不能收回。在前N/2轮中,每轮谁的牌点数大谁就赢;在后N/2轮中,每轮谁的牌点数小谁就赢。已知Bob 每一轮会出什么牌,试求Alice 最多能赢多少轮。
输入
第一行是一个整数N,
接下来N行,每行一个整数,表示Bob这轮会出什么。
2<=N <= 50000,保证N是偶数
输出
输出Alice最多能赢几轮
样例输入
4
1
8
4
3
样例输出
2
题解
#include <cstdio>
#include <algorithm>
using namespace std;
int n;
int a[50010];
int b[50010];
bool vis[100010];
int ans;
bool cmp(const int &a, const int &b){return a>b;}
int main()
{
register int i;
scanf("%d",&n);
for(i=1;i<=n;i++){scanf("%d",&b[i]);vis[b[i]] = 1;}
int sit = 1;
for(i=n<<1;i>=1;i--){if(!vis[i])a[sit++] = i;}
//sort(a+1,a+1+(n>>1),cmp); // 这部分没有必要排序
sort(a+1+(n>>1),a+1+n);
sort(b+1,b+1+(n>>1),cmp);
sort(b+1+(n>>1),b+1+n);
int r = n>>1;
int l = 1;
for(i=1;i<=n>>1;i++)
{
if(b[i] > a[l]){r--;}
else {l++;ans++;}
}
l = (n>>1)+1;
r = n;
for(i=(n>>1)+1;i<=n;i++)
{
if(b[i] < a[l]){r--;}
else {l++;ans++;}
}
printf("%d\n",ans);
return 0;
}