题解 P4816 【[USACO15DEC]高低卡(金)High Card Low Card (Gold)】
liyilin2004 · · 题解
思路:贪心
赤裸裸的贪心
把读入的数据分成1~n/2,n/2+1~n两份,排序,用剩下的数(也就是Bessie的牌)最大的对第一份最大的数,依次减小,最小的对第二份最小的,依次增大
上代码咯
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
int a[25001],c[25001],b[100001];||a存前半部分,c存后半部分,b记录是谁的牌
int ans;
int main()
{
cin>>n;
for(int i=1;i<=n/2;i++)
{
cin>>a[i];
b[a[i]]=1;
}
for(int i=1;i<=n/2;i++)
{
cin>>c[i];
b[c[i]]=1;
}
sort(a+1,a+1+n/2);
sort(c+1,c+1+n/2);||排序,方便下面贪心
int j=2*n;
for(int i=n/2;i>=1;i--)||从大到小枚举前半部分
{
while(b[j]&&j>=1)||找到Bessie未用的最大的牌
j--;
if(j<a[i])||最大的也比这张牌小,无解
continue;
else
b[j]=1,ans++;
}
j=1;
for(int i=1;i<=n/2;i++)
{
while(b[j]&&j<=2*n)||找到Bessie未用的最小的牌
j++;
if(j>c[i])||最小的也比这张牌大,无解
continue;
else
b[j]=1,ans++;
}
cout<<ans;
return 0;
}
安利一发博客liyilin2004的博客 欢迎来拜访⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄