第五題
遊戲(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...