zoukankan      html  css  js  c++  java
  • 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
    ");
        else printf("Dead
    ");
        return 0; 
    }
  • 相关阅读:
    CREATE AGGREGATE
    技术文档列表
    jQuery 判断表单中多个 input text 中至少有一个不为空
    Java实现 蓝桥杯 算法提高 奥运会开幕式
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最大值路径
    Java实现 蓝桥杯 算法提高 最大值路径
    Java实现 蓝桥杯 算法提高 最大值路径
  • 原文地址:https://www.cnblogs.com/ybwowen/p/10966912.html
Copyright © 2011-2022 走看看