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; 
    }
  • 相关阅读:
    C++语法小记---string类
    C++语法小记---标准库
    C++语法小记---运算符重载
    C++语法小记---函数重载
    C++语法小记---友元
    C++语法小记---开篇
    STM32使用printf丢失第一个字母的问题
    AD芯片的基准参考电压问题
    运算放大器的调试经验
    [置顶] TIM_GetCounter与TIM_GetCapture1的区别
  • 原文地址:https://www.cnblogs.com/ybwowen/p/10966912.html
Copyright © 2011-2022 走看看