NEERC2013 Kabaleo Lite

有意思的贪心题。

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值