本题改编自USACO(USA Computing Olympiad) 1.1节的第一题
(感谢lsy同学对本题题面的贡献)
直接计算就好了
chr:将ASCII码转成字符
ord:字符对应的ASCII码值
注意:初始化为1,否则会乘0
s1=input() s2=input() sum1=1 sum2=1 for i in s1: sum1*=(ord(i)-ord('A')+1) sum1%=47//边乘边模 for i in s2: sum2*=(ord(i)-ord('A')+1) sum2%=47 if sum1==sum2: print("HAHA") else: print("TOOBAD")
大水题,送分的
s=input() print(s+"txdy!")
对于每一个数,我们用一个列表来记录它出现的次数
然后我们再看有多少个数出现了3次和两次就行了
s=input() cnt=[0]*20 for i in s: cnt[ord(i)-ord('0')]+=1 sum3=0 sum2=0 for i in range(0,8): if cnt[i]==3: sum3+=1 elif cnt[i]==2: sum2+=1 if sum3==4 and sum2==1: print("djqtql!") else : print("Fake!")
直接移动即可,注意特判‘z'
s=input() for i in s: if i=='z': print('a',end="") else : print(chr(ord(i)+1),end="")
提示:本题有彩蛋
这题我们要用到一个思想——贪心(greedy)
本题我们只需要考虑律师是死是活
大家仔细想想,是不是他挡掉最大一次攻击是最优的呢?
于是这题就出来了:
hp,n,m=map(int,input().split()) a=list(map(int,input().split())) b=list(map(int,input().split())) sum=0 tmp=0 for i in b: sum+=a[i-1] tmp=max(tmp,a[i-1]) sum-=tmp if sum<hp: print("Alive") else: print("Dead")
对于OIer(包括前OIer)们,建议你们再看看这题的另外一种做法:dp
设dp[i][0/1]表示第i次攻击律师能承受的最小可能的伤害,其中0表示没有挡过,1表示挡过了
状态转移方程:
dp[i][0]=dp[i-1][0]+a[b[i]]
dp[i][1]=max(dp[i-1][0],dp[i-1][1]+a[b[i]])
(python代码被我Gu掉了,咕咕咕~)
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+5; int dp[maxn][2]; int a[maxn]; int b[maxn]; int w,n,m; int main(){ cin>>w>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=m;i++) cin>>b[i]; dp[0][0]=dp[0][1]=w; for(int i=1;i<=m;i++){ dp[i][0]=dp[i-1][0]-a[b[i]]; dp[i][1]=max(dp[i-1][1]-a[b[i]],dp[i-1][0]); } int ans=max(dp[m][0],dp[m][1]); if(ans>0) printf("Alive "); else printf("Dead "); return 0; }