演算法競賽 幾道比較複雜的模擬題

2021-10-17 18:49:01 字數 3580 閱讀 4545

最近做了幾道稍微複雜一點的模擬題,不算太難但考慮的情況比較多比較雜,需要細心

有n個玩具小人圍成一圈, 已知它們的職業和朝向。現在第1個玩具小人告訴小南乙個包含m條指令的謎題, 其中第z條指令形如「左數/右數第s個玩具小人」。 你需要輸出依次數完這些指令後,到達的玩具小人的職業。

實際上,問題可以看成玩具一開始在第乙個小人的手上,然後有m條指令,每條指令都是把玩具傳給左數/右數第s個玩具小人,求最後玩具在哪個人手裡。那麼,根據指令的內容和玩具的朝向,每次就可以找到這個玩具在哪個人手裡。分為以下幾種情況:

小人朝外,指令左數

小人朝外,指令右數

小人朝內,指令左數

小人朝內,指令右數

每種情況分別處理即可。

#include

#include

#define n 100010

using

namespace std;

struct peoplea[n]

;struct orderb[n]

;int

main()

for(

int i =

0; i < m; i++

) cin >> b[i]

.direction >> b[i]

.step;

for(

int i =

0; i < m; i++

) cout << a[now]

.name;

return0;

}

在初賽普及組的「閱讀程式寫結果」的問題中,我們曾給出乙個字串展開的例子:如果在輸入的字串中,含有類似於「d-h」或者「4-8」的字串,我們就把它當作一種簡寫,輸出時,用連續遞增的字母或數字串替代其中的減號,即,將上面兩個子串分別輸出為「defgh」和「45678"。在本題中,我們通過增加一些引數的設定,使字串的展開更為靈活。具體約定如下:

(1) 遇到下面的情況需要做字串的展開:在輸入的字串中,出現了減號「-」,減號兩側同為小寫字母或同為數字,且按照ascii碼的順序,減號右邊的字元嚴格大於左邊的字元。

(2) 引數p_1 :p _1 =1時,對於字母子串,填充小寫字母;p_1=2時,對於字母子串,填充大寫字母。這兩種情況下數字子串的填充方式相同。p_1=3時,不論是字母子串還是數字字串,都用與要填充的字母個數相同的星號「*」來填充。

(3) 引數p_2:填充字元的重複個數。p_2=k表示同乙個字元要連續填充k個。例如,當p_2=3時,子串「d-h」應擴充套件為「deeefffgggh」。減號兩邊的字元不變。

(4) 引數p_3:是否改為逆序:p3=1表示維持原來順序,p_3=2表示採用逆序輸出,注意這時候仍然不包括減號兩端的字元。

例如當p_1=1、p_2=2、p_3=2時,子串「d-h」應擴充套件為「dggffeeh」。

(5) 如果減號右邊的字元恰好是左邊字元的後繼,只刪除中間的減號,例如:「d-e」應輸出為「de」,「3-4」應輸出為「34」。如果減號右邊的字元按照ascii碼的順序小於或等於左邊字元,輸出時,要保留中間的減號,例如:「d-d」應輸出為「d-d」,「3-1」應輸出為「3-1」。

分情況討論:

首尾是「-」時,保持不變,原樣輸出

「-」兩邊不同為數字或字母時,保持不變,原樣輸出

「-「兩邊為相同數字或字母,去掉「-」

「-」兩邊同為數字或字母,且左邊ascii碼值大於或等於右邊,保持不變,原樣輸出

一般情況:「-」兩邊同為數字或字母,且左邊ascii碼值小於右邊,按照題目要求展開,其中數字不需要考慮大小寫,字母要考慮大小寫

#include

#include

#include

using

namespace std;

intmain()

}else

if(p1 ==2)

//大寫

}else

if(p1 ==3)

//星號}}

else

if(p3 ==2)

//逆序

}else

if(p1 ==2)

//大寫

}else

if(p1 ==3)

//星號}}

}//最一般的情況(數字)

else

if(flag1 >=

48&& flag1 <=

57&& flag2 >=

48&& flag2 <=

57&&

((flag2 - flag1)

>1)

)}else

//p1==1,2}}

else

if(p3 ==2)

//逆序

}else

//p1==1,2}}

}//後繼的情況

else

if(flag2 - flag1 ==1)

continue

;//左右不同為數字或字母

else

cout <<

'-';

}else

cout << str[i];}

return0;

}

石頭剪刀布是常見的猜拳遊戲:石頭勝剪刀,剪刀勝布,布勝石頭。如果兩個人出拳一 樣,則不分勝負。在《生活大**》第二季第8集**現了一種石頭剪刀布的公升級版遊戲。

公升級版遊戲在傳統的石頭剪刀布遊戲的基礎上,增加了兩個新手勢:

斯波克:《星際迷航》主角之一。

蜥蜴人:《星際迷航》中的反面角色。

這五種手勢的勝負關係如表一所示,表中列出的是甲對乙的遊戲結果

現在,小a和小b嘗試玩這種公升級版的猜拳遊戲。已知他們的出拳都是有週期性規律的,但週期長度不一定相等。例如:如果小a以「石頭-布-石頭-剪刀-蜥蜴人-斯波克」長度為 6 的週期出拳,那麼他的出拳序列就是「石頭-布-石頭-剪刀-蜥蜴人-斯波克-石頭-布-石頭-剪刀-蜥蜴人-斯波克-…」,而如果小b以「剪刀-石頭-布-斯波克-蜥蜴人」長度為 5 的週期出拳,那麼他出拳的序列就是「剪刀-石頭-布-斯波克-蜥蜴人-剪刀-石頭-布-斯波克-蜥蜴人-…」

已知小a和小b 一共進行 n 次猜拳。每一次贏的人得 1 分,輸的得 0 分;平局兩人都得 0 分。現請你統計 n 次猜拳結束之後兩人的得分。

還是分情況討論。把小a堪稱甲,小b看成乙,然後根據**分情況討論每次甲出拳的輸贏,注意出拳週期,要用到取餘

#include

#define n 205

using

namespace std;

int a[n]

, b[n]

;int

main()

else

if(a[i % n_a]==1

)else

if(a[i % n_a]==2

)else

if(a[i % n_a]==3

)else

if(a[i % n_a]==4

)}cout << score_a <<

" "<< score_b;

return0;

}

比較複雜的字串處理

using system using system.drawing using system.collections using system.componentmodel using system.windows.forms using system.data using system io us...

幾道比較難的SQL題

select from article where create timenow article time order by create time asc limit 1 select a.rownum rownum 1 as rowno from a,select rownum 3 b通過變數r...

對比較複雜的資料結構進行建模分析

今天和架構師學了一招,我覺得很不錯,能解決資料結構複雜時,如何能清楚的表達你的資料結構的組合關係。問題的產生主要的我寫乙個圖方面的資料結構,怎麼講也將不清楚,後來架構師交我怎麼一步一步建模,後來發現這個真的很管用,我自己覺得這個挺有用的,和大家分享一下。例子如下 儲存路徑的資料結構 圖的鄰接節點資訊...