银联高校极客挑战赛第一场 A.码队女朋友的王者之路[水题]
题目地址
题干
代码和解释
本题难度不大,但是一开始没有读懂题,以为净胜场次是确定的,没有“最高净胜场次”的说法。于是算出第一赛季的最终净胜场次(即打完一整个赛季),然后直接乘M,这样可以通过两个样例,但是错误的。因为两个样例的情况都是每赛季最终净胜场次与最高净胜场次都为正且恰好相同。正确的理解是在某一时刻,即某赛季进行完某一场比赛时有“最高净胜场次”。
所以应该分类讨论。
1.若第一个赛季的最终净胜场次大于0,那么前M-1个赛季都完全进行,最后一个赛季打到最高净胜场次为止。因为每一个赛季的战况完全相同,即:“第一个赛季的最终净胜场次*(M-1)+第一个赛季的最高净胜场次;
2.若第一个赛季的最终净胜场次小于或等于0,那么只进行到在第一个赛季中获得最高净胜场次为止,即“第一个赛季的最高净胜场次”。
#include<stdio.h>
#include<string.h>
int main()
{
int T;
int N,K;
long long M;
long long ans;
int i;
int tmp[1000];
int t;
int max;
char s[1000];
scanf("%d",&T);
while(T--){
scanf("%d%d%lld",&N,&K,&M);
//printf("%d %d %lld\n",N,K,M);
memset(s,0,sizeof(s));
memset(tmp,0,sizeof(tmp));
scanf("%s",s);
//printf("%s\n",s);
t = 0;
for(i=0;i<strlen(s);i++){
if(s[i]=='1'){
t++;
}
else if(s[i]=='0'&&K>0){
K--;
}
else if(s[i]=='0'&&K<=0){
t--;
}
tmp[i]=t;
}
max = 0;
for(i=0;i<strlen(s);i++){
//printf("%d\n",tmp[i]);
if(tmp[i]>=max){
max=tmp[i];
}
}
if(tmp[strlen(s)-1]>0){
ans=tmp[strlen(s)-1]*(M-1)+max;
//printf("state A\n");
}
else{
ans=max;
//printf("state B\n");
}
printf("%lld\n",ans);
}
return 0;
}
注意M要设置为long long型,因为涉及乘法可能会超出int范围。
STAY. you have NO WHERE TO GO. try to live it well. for you have only ONE life.