HDU 2293

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 ;
    }
原文地址:https://www.cnblogs.com/xiaolongchase/p/2152914.html