NOIP2008解題報告

2022-04-30 10:48:09 字數 2975 閱讀 2034

2023年的題目相對比較簡單,都不是很麻煩,認真寫就能寫對。

第一題:

題目大意:給出乙個小寫單詞,求出最少出現的字母的出現次數和最多出現的字母的出現次數。

解題過程:直接hash模擬就好。

第二題:

給你n根火柴棍,你可以拼出多少個形如「a+b=c」的等式?等式中的a、b、c是用火柴棍拼出的整數(若該數非零,則最高位不能是0)。用火柴棍拼數字0-9的拼法如圖所示:

注意:1. 加號與等號各自需要兩根火柴棍

2. 如果a≠b,則a+b=c與b+a=c視為不同的等式(a、b、c>=0)

3. n根火柴棍必須全部用上。n<=24

解題過程:

1.一開始看到a+b=c,想到直接列舉,但是也有可能出現1111+0=1111的情況。。因此不好確定列舉的範圍。

2.於是決定用dfs兩個加數,然後看剩下的火柴能否拼出和。對於任意乙個數,可以在它的末尾加上0~9的數字,代價是相應需要的火柴數量,這樣保證不會重複。有個小優化,不過我懶得寫了,就是令第乙個數不比第二個數大,搜到結果時,如果第乙個數和第二個數相等,ans+1,否則ans+2。這樣可以減少一半的搜尋量,不過資料如此小,不寫也無所謂。

第三題:

題目大意:就是方格取數的變形,變成了2個人一起走,且另外乙個人走過的地方不能再走。

解題過程:

和2023年方格取數那題幾乎一樣。只不過00年的是走過的地方可以再走,只不過得到的分數為0,因此只要在00年那題的動態規劃方程裡改一下,如果i=j且沒有到達終點的時候,f[k][i][j]=-inf. f[k][i][j]表示走了k步,第乙個人向下走了i步,第二個人向下走了j步的最大得分。

動態規劃的部分**:

1

for (int k=1;k<=n+m-2;k++)

2for (int i=0;i)

3for (int j=0;j)410

if (i!=0 && j!=0

)11 g[k][i][j]=ma(g[k][i][j],g[k-1][i-1][j-1

]);12

if (i!=0 && j!=k)

13 g[k][i][j]=ma(g[k][i][j],g[k-1][i-1

][j]);

14if (i!=k && j!=k)

15 g[k][i][j]=ma(g[k][i][j],g[k-1

][i][j]);

16if (i!=k && j!=0

)17 g[k][i][j]=ma(g[k][i][j],g[k-1][i][j-1

]);18 g[k][i][j]+=a[i+1][1+k-i]+a[j+1][1+k-j];

19 }

第四題:

tom最近在研究乙個有趣的排序問題。如圖所示,通過2個棧s1和s2,tom希望借助以下4種操作實現將輸入序列公升序排序。

操作a如果輸入序列不為空,將第乙個元素壓入棧s1

操作b如果棧s1不為空,將s1棧頂元素彈出至輸出序列

操作c如果輸入序列不為空,將第乙個元素壓入棧s2

操作d如果棧s2不為空,將s2棧頂元素彈出至輸出序列

如果乙個1~n的排列p可以通過一系列操作使得輸出序列為1,2,…,(n-1),n,tom就稱p是乙個「可雙棧排序排列」。例如(1,3,2,4)就是乙個「可雙棧排序序列」,而(2,3,4,1)不是。下圖描述了乙個將(1,3,2,4)排序的操作序列:

當然,這樣的操作序列有可能有幾個,對於上例(1,3,2,4),是另外乙個可行的操作序列。tom希望知道其中字典序最小的操作序列是什麼。

解題過程:

1.一開始手工模擬了一下,感覺可以貪心。如果當前元素比棧頂元素大,那麼肯定不能放到棧頂。(有點類似漢諾塔。)貪心策略如下:能往a棧放的就盡量往a棧放,否則放b棧,如果兩個都沒法放,就輸出無解。如果當前元素就是下乙個要到輸出佇列的元素,那麼進棧a然後出來,也就是操作』a『+』b',然後用乙個while把該出來的都出來。。很快寫好,自己寫棧也才1000b左右,但是提交只能過5個點。。考試來不及這樣寫也不錯。。

2.正解:參考部落格 寫的非常清晰,**也簡潔易懂,短小精悍。。

首先根據棧的性質,s[i],s[j]兩個元素不能進入同乙個棧 <=> 存在k,滿足i

因此只要找出所有不能在同時在同乙個棧的入棧序列出現的數對(i,j),讓前面的元素盡量進a棧。這實際上是乙個判斷二分圖的過程,用染色的方法判斷,如果不是二分圖必然無解。如果是,模擬出棧即可。

我的**:

1 #include2 #include3

using

namespace

std;45

char ans[2014];6

int n,a[1010],stack1[1010],stack2[1010

],top1,top2,cur;

7int p[1010],q[1010];8

int g[1010],color[1010],edge[1010][1010],flag=1;9

10void

pop()

1120

else

2126}27

}2829void dfs(int x,int

c)30

42if (!color[i])

43 dfs(i,3-c);44}

45}4647

void

solve()

4864 cur=1

;65 stack1[0]=stack2[0]=210000;66

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

6773

else

7478

pop();79}

80pop();81}

8283

intmain()

84

noip2008 傳球遊戲

上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師再次吹哨子時,傳球停止,此時,拿著球沒傳出去的那個同學...

NOIP2008 傳球遊戲

本著刷一刷noip真題做了這道,寫篇題解加深印象。傳送門 題面總的來說就是n個人圍城個圈,每次傳球只能傳給左邊或右邊,設從1號位發球,求m步傳回1號位的方案數。從1號位開始搜,每次向左右兩邊擴充套件,m步時落在1號位ans 其中1和n的情況需要判斷一下。include include using n...

NOIP 2008 傳球遊戲

洛谷傳送門 jdoj傳送門 上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師再次吹哨子時,傳球停止,此...