2019-06-03 校内python模拟题解(所有非原题)

一起来女装吧

本题改编自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="")

提示:本题有彩蛋

ikun的复仇

这题我们要用到一个思想——贪心(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\n");
    else printf("Dead\n");
    return 0; 
}

 

posted @ 2019-06-03 12:56  ybwowen  阅读(240)  评论(0编辑  收藏  举报