NEERC2013 Kabaleo Lite

来源:互联网 发布:网络机顶盒看电视软件 编辑:程序博客网 时间:2024/06/05 18:52

有意思的贪心题。

n=1时特判,只有当最后player的棋子和player_1的胜利棋子是相同的,player_1才能取胜。

剩下的,我们可以看到对于   player_1的胜利棋子  的棋子   他的任务就是尽量覆盖 player_1的胜利棋子 ,而对于和   player_1的胜利棋子   相同的棋子   在最坏情况下会放在一个位置——自身覆盖。

枚举player_1的覆盖点,计算当前的最多点的棋子数和   player_1的胜利棋子   的数目,严格小于则输出此位置。

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int Maxn=1000005;int s[Maxn],n,p,c,h,i,a[Maxn],b[Maxn],dig[Maxn],max1,max2,cnt,ext,ans;bool Judge(int pos){  int k=s[h]-cnt;  if (k<=0) k+=ext;  return !(s[max1]>=k || s[max2]>=k || (b[1]!=h && s[b[1]]>=k));}int main(){  freopen("kabaleo.in","r",stdin);  freopen("kabaleo.out","w",stdout);  scanf("%d%d%d%d",&n,&p,&c,&h);  for (i=1;i<=n;i++){    scanf("%d",&a[i]);s[a[i]]++;  }  for (i=1,cnt=p-1;i<=p;i++){    scanf("%d",&b[i]);if (i>1 && b[i]!=h) s[b[i]]++;if (i>1 && b[i]==h) cnt--;  }  if (n==1){  if (b[p]!=h) printf("0\n");    else printf("1\n1\n");  return 0;  }  ext=(b[p]==h);  for (i=1;i<=c;i++)  if (i!=h){if (s[i]>s[max1]) max2=max1, max1=i;else if (s[i]>s[max2]) max2=i;  }  s[b[1]]++;  for (i=1,ans=0;i<=n;i++){  s[a[i]]--;    if (Judge(i)) dig[ans++]=i;    s[a[i]]++;  }  printf("%d\n",ans);  for (i=0;i<ans;i++)    printf("%d\n",dig[i]);  return 0;}


0 0
原创粉丝点击