zoukankan      html  css  js  c++  java
  • EOJ Monthly 2018.1

    985月赛,当时鸽了,现在想补一补

    A. 石头剪刀布的套路

    Time limit per test: 1.0 seconds

    Memory limit: 256 megabytes

    现在有一种石头剪刀布锦标赛。采取 100 局胜负制。对战 100 局,扣掉平局,谁赢得多谁就取得最终的胜利。

    zzz 同学天天玩石头剪刀布,从而总结出了一套提高石头剪刀布胜率的方法。这套方法重点在于利用人的心理。石头剪刀布这三者,你可能觉得你是随机选择的,但其实不然。你还是会产生一定的偏向性。在若干局游戏后,有的人出石头的频数会高,有的人出布的频数会高,还有的人出剪刀的频数会高。

    这点差异其实微乎其微,但却能成为决定胜负的关键。zzz 同学也就是靠着这微乎其微的差异,拿到了石头剪刀布世界冠军,攀上人生巅峰。

    作为 zzz 同学的室友,你对 zzz 同学出石头剪刀布的套路掌握得一清二楚。具体如下:

    • 他会根据对方之前已经出过的石头次数、剪刀次数、布次数,来决定最不利于对方的。比如对方剪刀最多,他一定会出石头;对方布最多,他一定会出剪刀;对方石头最多,他一定会出布。
    • 在比赛开始前,他会给石头剪刀布各分配一个优先级,分别为 p,q,r。如果存在两个一样多,或三个一样多,或者一个都没出过(刚开局),那么他会优先选择优先级高的。比如说对方出过的剪刀和布一样多,石头就比较少,那么他接下来的选择一定在石头和剪刀之间。如果石头的优先级为 3,剪刀的优先级为 2,那么他就会优先选择石头。

    zzz 同学是很死板的,他肯定不会违背这套策略。也就是说,一旦你搞到了他即将参加的比赛的优先级 p,q,r,你基本已经赢了,甚至连这 100 局每局是输是赢都想好了。

    于是你膨胀了。你要去挑战世界冠军 zzz。

    Input

    有且仅有一行,三个整数 p,q,r ({p,q,r}={1,2,3}),用空格隔开。

    不会有两个相同的测试点。

    Output

    输出 100 行,每行一个整数,依次为这 100 局你的选择。

    石头输出 1,剪刀输出 2,布输出 3

    Note

    此题无样例。

    100局,扣去平局,你只要赢他的比输给他的多就行了

    我本来觉得既然已经分配了,我只要输出一种可以让赢的比输的多,然后就行了,每次克制,我还列了六种情况,其实只分三种喽,那次优先级最高知道就好了

    你还是会产生一定的偏向性。在若干局游戏后,有的人出石头的频数会高,有的人出布的频数会高,还有的人出剪刀的频数会高。对方也会根据我们出的出啊,所以要那样想的话只能一次石头剪刀布全出一遍,这样只要确保三轮的一次对战我能保证赢就好了,即使都是平局,最后一次赢就好了,所以每次出一遍啊

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int p,q,r;
        cin>>p>>q>>r;
        int a[4]={0,1,2,3};
        if(p==3)a[1]=3,a[2]=1,a[3]=2;
        else if(r==3)a[1]=2,a[2]=3,a[3]=1;
        for(int i=0;i<33;i++)
            cout<<a[1]<<"
    "<<a[2]<<"
    "<<a[3]<<"
    ";
        cout<<a[1]<<"
    ";    
        return 0;
    }
    B. 最大的子串

    Time limit per test: 1.0 seconds

    Memory limit: 256 megabytes

    字符串的大,不在于长,而在于妙。

    现在给出由数字组成的字符串 s,求出字符串的所有的非空连续子串中,最妙的那个子串。

    一个字符串的妙是这样定义的:将这个子串所表示的整数(有可能带前导 0),除以 10L(其中 L 为字符串的长度)。比如说 123456789 的子串 456 的妙为 456103=0.456

    Input

    给出一行一个字符串 s (1|s|20 000)。

    Output

    输出最妙的那个子串。如果有多个,输出最短的那个。如果最短的最妙的子串也有多个,输出字典序最小的那个。

    Examples

    input
    123456789
    
    output
    9
    
    input
    321
    
    output
    321

     

     写丑了写丑了,就是一个贪心取字符串而已,找最大的数,输出不包括前导0

    #include<bits/stdc++.h>
    using namespace std;
    string s,t;
    void la()
    {
        int f=1;
        for(int i=9; i>0&&f; i--)
            for(int j=0; s[j]; j++)
                if(s[j]-'0'==i&&(f||!f&&s.substr(j)>t))
                    t=s.substr(j),f=0;
    }
    int main()
    {
        cin>>s;
        int f=1;
        for(int i=s.length()-1; ~i; i--)
        {
            if(s[i]!='0')
            {
                s=s.substr(0,i+1),f=0;
                break;
            }
        }
        if(f)
        {
            cout<<0;
            return 0;
        }
        la();
        cout<<t;
    }
    C. 我决不会 TLE

    Time limit per test: 2.5 seconds

    Memory limit: 256 megabytes

    xxx 写了一份用 DFS 求有向无环图中顶点 1 到 n 最短路的代码,出乎意料的是这份代码竟然通过了所有测试点。于是你暗地里把出题人骂了一通,然后决定造个数据把这个假算法卡掉。

    核心代码如下:

    global variable: answer_now
    
    function dfs(u, distance_now)
        if distance_now >= answer_now then
            return
        if u == n then 
            answer_now = distance_now
            return
        for each u->v in edges
            dfs(v, dist + 1)
    
    function find_shortest_path()
        answer_now = INFINITY
        dfs(1, 0)
        return answer_now
    

    Output

    第一行两个数 n,m,分别表示图中点的个数和边的条数。(1n50,1m100) 
    之后 m 行,每行两个数 u,v,表示顶点 uv 有一条有向边。 (1u,vn)

    要求:

    • 存在 1 到 n 的路径。
    • 不能有重边。
    • 不能有环。
    • xxx 的算法会给出错误解或者运行超时(时限是 2 秒)。

    Examples

    input
    Sample
    
    output
    7 8
    6 7
    1 2
    1 3
    2 4
    2 5
    3 5
    4 6
    5 6
    

    Note

    样例给出了一种可能的输出(不是正确的输出)。

    我本来还在想这个方法会不会就是错的,因为会爆栈,但是分析它要看他是否超时

    超时就是访问这个节点之后又有了很多节点可以访问,但是有个限制条件,先找到路之后,其他的比他远就不再找了,这样他算法还是能用的

    所以你要访问这个点他的dist还要满足继续往下深搜的

    所以这样构造就是错的,并不满足dist

    void dfs(int u,int no)
    {
        //f++;
        if(no>=ans)return;
        if(u==50)
        {
            ans=no;
            return;
        }
        for(auto X:G[u])dfs(X,no+1);
    }

    所以就应该保证最短路的数量足够多,我的能找到最短路啊,所以直接构造这个点可以这个点也可以下个点

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        int i;
        printf("%d %d
    ",50,89);
        for(i=1; i<=40; i++)
            printf("%d %d
    %d %d
    ",i,i+1,i,i+2);
        for(;i<50;i++)
            printf("%d %d
    ",i,i+1);
        return 0;
    }
  • 相关阅读:
    pyinstaller相关用法
    yield 与 yield from
    async /await相关知识理解
    调试程序方法pdb
    任务22-4
    任务22-2
    跳台阶
    计算三维空间某点距离原点的欧式距离
    质数判断
    罗马数字转换
  • 原文地址:https://www.cnblogs.com/BobHuang/p/8341236.html
Copyright © 2011-2022 走看看