985月賽,當時鴿了,現在想補一補
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; }
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
123456789
9
321
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; }
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,分別表示圖中點的個數和邊的條數。(1≤n≤50,1≤m≤100)
之后 m 行,每行兩個數 u,v,表示頂點 u→v 有一條有向邊。 (1≤u,v≤n)
要求:
- 存在 1 到 n 的路徑。
- 不能有重邊。
- 不能有環。
- xxx 的算法會給出錯誤解或者運行超時(時限是 2 秒)。
Examples
Sample
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; }