您的位置:首页 > 其它

Codeforces 103C Russian Roulette

2016-07-29 09:28 260 查看
题意:

给你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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: