Codeforces 103C Russian Roulette

题意:

给你n<=1e18、k、p分别表示弹夹容量、子弹个数、询问次数,每次询问输入个x问你弹夹内第x个位置是什么,.表示空、X表示子弹。

思路:

题目要求让第一个先开枪的人的胜率最大,那么对于k个子弹,我们最好的方法是让他们交替出现,对于多出来的子弹,由于题目要求字典序尽量小,也就是X尽量放后面,那么我们把多于弹夹一半的子弹从后往前一个一个地填在空位子,由于这题的n<=1e18所以我们无法开数组取存,那么我们需要推导个公式来每次对x进行位子的判断。

#include<cstdio>
typedef __int64 LL;

LL n,k,x;
int p;

int main(){
	scanf("%I64d%I64d%d",&n,&k,&p);
	LL more=k-n/2;
	if(more<0) more=0;
	while(p--){
		scanf("%I64d",&x);
		if(k==0) printf(".");
		else if(k==1){
			if(x==n) printf("X");
			else printf(".");
		}
		else{
			if(n%2){
				if(x==n) printf("X");
				else{
					LL t1=n-2*(k-1);
					LL t2=n-(1+(more-1)*2);
					if((x-t1)<0) printf(".");
					else if((x-t1)%2==1) printf("X");
					else if(x>=t2&&(x-t2)%2==1) printf("X");
					else printf(".");
				}
			}
			else{
				LL t1=n-2*(k-1);
				LL t2=n-(1+(more-1)*2);
				if((x-t1)<0) printf(".");
				else if((x-t1)%2==0) printf("X");
				else if(x>=t2&&(x-t2)%2==0) printf("X");
				else printf(".");
			}
		}
	}
	printf("\n");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值