2023年小學甲組 game

2021-07-31 17:21:09 字數 1932 閱讀 4163

第五題

遊戲(game)

問題描述:

今天是星期天,小楠楠來找你玩「石頭、剪刀、布遊戲」。你正在學習資訊學,所以想了一種需要程式設計來玩的「石頭、剪刀、布遊戲」。首先,用數字 1,2,3 分別表示出石頭、剪刀、布。其次,你確定自己前 n 次「石頭、剪刀、布」的出拳方法,下面 n 次再次同樣出拳,…,周而復始;也要求楠楠確定他前 m 次的出拳方法,然後周而復始。問第 k 次後,你贏了幾次?

例如:n=4,你的前 4 次出拳方式是「石頭、剪刀、布、布」,用數字表示即:」1

2 3  3」。m=5,楠楠前 5 次出拳方式是「剪刀、石頭、石頭、布、布」 ,用

數字表示即:」2 1 1 3 3」。k=10 時,情況如下表:輪次2

4569

你出拳231

21楠楠出拳13

323贏

你共贏了 5 次。

輸入格式:

第一行 3 個整數 n,m,k。分別表示你出拳方式的週期長度、楠楠出拳方式的週期長度和總共玩的次數。

第二行有 n 個整數,每個整數為 1、2、3 其中之一。

第三行有 m 個整數,每個整數為 1、2、3 其中之一。

輸出格式:

乙個整數,表示 k 輪出拳後,你贏的次數。

輸入樣例:6

3231

2輸出樣例

資料範圍:

個資料: n,m 的範圍是[1..100],k 的範圍是[1…100,000]。

個資料:

n,m 的範圍是[1..100],k 的範圍是[1…1,000,000,000]

友情提示)整數陣列開的太大(比如 30,000,000)可能會因超空間而得 0 分。

題目意思就是要我們求k輪後,自己贏的次數。因為自己和楠楠的出拳方式是一直固定的,所以只需列舉就行了。但

直接列舉肯定超時。

因為自己的出拳方式和楠楠的出拳方式的週期不同,所以又延伸出乙個週期問題。轉變過來就是成了找最小公倍數的問題。

找最小公倍數時,我們又可以運用一種快捷方法,輾轉相除法。

輾轉相除法求兩個數的最大公約數的步驟如下:

先用另乙個數

除以乙個數

,得第乙個餘數;

再用上一次的

除數除以

第乙個餘數

,得第二個餘數; 又用

上一次的除數

除以第二個餘數

,得第三個餘數;

這樣逐次上一次除數除以前乙個餘數,直到餘數是0為止.那麼,最後乙個除數就是所求的最大公約數。

最大公倍數即為兩個數的積除以兩個數的最小公約數。

算出在最小公倍數以內我勝利的回合,再用k除以最小公倍數以內我勝利的回合,就可算出k回合以內我贏的次數了。

如果k%最小公倍數以內我勝利的回合不為0的話,那麼還需在一開始用個變數儲存餘數,在for循壞中找出當i等於餘數時,用個變數c儲存當前我勝利的次數,最後只需輸出k除以最小公倍數以內我勝利的回合加上c即可。

程式如下:

#include#include#includeusing namespace std;

int a,b,c,d[105],e[105],f,j,l,m,n,p,v,q,k,r;

bool vt(int o,int z)//用函式判斷我是否贏了

int main()

a=n*k/b;

b=p%a;

for(int i=1;i<=n;i++)

cin>>d[i];

for(int i=1;i<=k;i++)

cin>>e[i];

for(int i=1;i<=a;i++)//for迴圈算出最小公倍數以內我勝利的回合

cout<

2023年南海區甲組 撲克遊戲 poker

題目描述 有一種別樣 小貓釣魚 撲克遊戲。有 n 張牌,每張牌都有乙個花色和點數。遊戲的規則 撲克接龍時,若前面有同樣花色的牌,你可以將這兩張牌連同之間的牌都取走,得到的分值為取走牌點數之和。這裡說的是可以,不是必須。給定撲克接龍的順序,求最多的得分。輸入第一行乙個整數 n。第二行 n 個整數,依次...

2023年南海區甲組 拆除橋墩 remove

題目描述 河的左岸到右岸之間有一座年久失修 已經廢棄的大橋,有 n 個橋墩,影響船隻通行。現在要拆除部分橋墩,使得通航能力最大,通航能力由最窄的地方決定的,這個地方有可能是岸與橋墩之間,也可以是橋墩之間。工程預算有限,只能拆除 m 個橋墩。如何安排工程,才能使得通航能力盡可能的大。輸入第一行包含三個...

HDU 5242 GAME 2015上海邀請賽G題

題意 給定一顆以1號節點為根節點的有向樹,每個節點有乙個權值,問從1號節點出發k次,能到達的所有節點的和的最大值。思路 貪心的把樹的鏈按照權值和從大到小剖分成若干條鏈 過程可以根據上交書上的熟練剖分模版做細小改動 然後根據每條鏈的權值排序取最大的k個就是答案。include include incl...