http://acm.hdu.edu.cn/showproblem.php?pid=2293
啥也不说了,一个简单的模拟让我弄成这样。
注意两个地方:
1. 最后不能用时间递增来模拟过程,要先求出每人hp<=0的时间,通过对比时间来决定胜负,否则会超时。
2. 过程中的取模要放到循环中,每次的相乘都取模,否则会乘法溢出。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std ;
int main(){
int n ;
cin >> n ;
int hp1, hp2, st1, st2, sp1, sp2 ;
char str1[25], str2[25] ;
while(n--){
hp1=0; hp2=0; sp1=0; sp2=0 ;
st1 = 1;
st2 = 1 ;
scanf("%s%s", &str1, &str2) ;
for(int j=0; j<strlen(str1); j++){
hp1 = (hp1+(83-str1[j])*(83-str1[j]))%97 ;
st1 = (st1*str1[j])%79 ;
for(int k=j+1; k<strlen(str1); k++)
sp1 = (sp1+str1[j]*str1[k])%11 ;
}
hp1 = 300 - hp1 ;
st1 += 22 ;
for(int j=0; j<strlen(str2); j++){
hp2 = (hp2+(83-str2[j])*(83-str2[j]))%97 ;
st2 = (st2*str2[j])%79 ;
for(int k=j+1; k<strlen(str2); k++)
sp2 = (sp2+str2[j]*str2[k])%11 ;
}
hp2 = 300 - hp2 ;
st2 += 22 ;
int n1, n2 ;
n1 = hp2 / st1 ;
n2 = hp1 / st2 ;
if(hp2%st1!=0) n1 ++ ;
if(hp1%st2!=0) n2 ++ ;
n1 = n1 * (20-sp1) ;
n2 = n2 * (20-sp2) ;
if(n1>n2) printf("lose\n") ;
else
if(n1==n2) printf("tie\n") ;
else printf("win\n") ;
}
return 0 ;
}
#include<cstdio>
#include<cstring>
using namespace std ;
int main(){
int n ;
cin >> n ;
int hp1, hp2, st1, st2, sp1, sp2 ;
char str1[25], str2[25] ;
while(n--){
hp1=0; hp2=0; sp1=0; sp2=0 ;
st1 = 1;
st2 = 1 ;
scanf("%s%s", &str1, &str2) ;
for(int j=0; j<strlen(str1); j++){
hp1 = (hp1+(83-str1[j])*(83-str1[j]))%97 ;
st1 = (st1*str1[j])%79 ;
for(int k=j+1; k<strlen(str1); k++)
sp1 = (sp1+str1[j]*str1[k])%11 ;
}
hp1 = 300 - hp1 ;
st1 += 22 ;
for(int j=0; j<strlen(str2); j++){
hp2 = (hp2+(83-str2[j])*(83-str2[j]))%97 ;
st2 = (st2*str2[j])%79 ;
for(int k=j+1; k<strlen(str2); k++)
sp2 = (sp2+str2[j]*str2[k])%11 ;
}
hp2 = 300 - hp2 ;
st2 += 22 ;
int n1, n2 ;
n1 = hp2 / st1 ;
n2 = hp1 / st2 ;
if(hp2%st1!=0) n1 ++ ;
if(hp1%st2!=0) n2 ++ ;
n1 = n1 * (20-sp1) ;
n2 = n2 * (20-sp2) ;
if(n1>n2) printf("lose\n") ;
else
if(n1==n2) printf("tie\n") ;
else printf("win\n") ;
}
return 0 ;
}