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]<<"\n"<<a[2]<<"\n"<<a[3]<<"\n";
    cout<<a[1]<<"\n";    
    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\n",50,89);
    for(i=1; i<=40; i++)
        printf("%d %d\n%d %d\n",i,i+1,i,i+2);
    for(;i<50;i++)
        printf("%d %d\n",i,i+1);
    return 0;
}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM