今天做了幾道藍橋杯的去年題

2022-05-31 18:03:19 字數 2355 閱讀 7172

找了幾道簡單的熱熱身,感覺自己演算法還是記不住,能描述,不會寫,應該是練少了的緣故。

今天一道題交了好幾遍才對啊,明明是很簡單的題啊啊啊啊啊,算了,先回憶一下心路歷程。

題目是這樣的

問題描述

棟棟正在和同學們玩乙個數字遊戲。

遊戲的規則是這樣的:棟棟和同學們一共n個人圍坐在一圈。棟棟首先說出數字1。接下來,坐在棟棟左手邊的同學要說下乙個數字2。再下面的乙個同學要從上乙個同學說的數字往下數兩個數說出來,也就是說4。下乙個同學要往下數三個數,說7。依次類推。

為了使數字不至於太大,棟棟和同學們約定,當在心中數到 k-1 時,下乙個數字從0開始數。例如,當k=13時,棟棟和同學們報出的前幾個數依次為:

1, 2, 4, 7, 11, 3, 9, 3, 11, 7。

遊戲進行了一會兒,棟棟想知道,到目前為止,他所有說出的數字的總和是多少。

輸入格式

輸入的第一行包含三個整數 n,k,t,其中 n 和 k 的意義如上面所述,t 表示到目前為止棟棟一共說出的數字個數。

輸出格式

輸出一行,包含乙個整數,表示棟棟說出所有數的和。

樣例輸入

3 13 3

樣例輸出

17樣例說明

棟棟說出的數依次為1, 7, 9,和為17。

資料規模和約定

1 題目就是這樣。由於t什麼的還是很大的,把這些資料都儲存下來不現實,當然乙個優秀的acmer也根本不會用都儲存下來的爛辦法(雖然我連acmer都不是)。如果不儲存資料,很容易就能想到必須要依靠規律,(我怎麼感覺我會做的只有找規律的,不開心)

規律很容易就想出來了,根據題目描述,那個數列(1,2,4,7,11)在所有情況下都是固定的,只不過每種情況被模的數不同,以及被棟棟輪到的數不同。很容易有遞推公式:f(n) = f(n-1)+n-1;(這裡的n是下標,不是題目中的人數)那麼哪個位置是棟棟該說的呢?容易知 i % n == 1的那個位置是棟的。由此我寫出了下面的**。

1 #include2

3int

main()

415 cout

1617

return0;

18 }

**一結局顯而易見,超時。t與n很大的時候(甚至不太大的時候)因為for迴圈裡面是t*n,超時是必然的。

當時我圖省事,上網學習了一下。有人和我有一樣的問題,並且有乙個人回答他,只關注棟棟的資料即可,不必每個資料都要求出來。(番外:回答這個問題的是我同學啊,我在問問題的時候別人已經開始回答問題了啊!!別問我怎麼知道的,誰叫他所有社交**都用的是同一張自己的**呢。)

既然只關注棟棟的資料,遞推公式就要重新推理了。以題目中3 13 3的資料分析。易知 f(n) = f(n - 3) + 3n - 6;這裡的n就是下標的意思,為了避免誤會換成 f(a) = f(a - 3) + 3a - 6;題目中是三個人一迴圈,如果是n個人一迴圈呢?遞推公式更具一般性。但是,這時,好死不死,我把遞推公式改成了 f(a) = f(a - n) + 3a - 6;這顯然是不對的,3a - 6也是要改的啊姑娘。當時我沒想到,興沖沖的就改好交了。3a - 6是啥呢,是a - 1 + a - 2 + a - 3;擴充套件到n是a - 1 + a - 2 + a - 3 +...+a - n;也就是a*n + n(n + 1)/2;遞推公式是f(a) = f(a - n) + a*n + n(n + 1)/2; t是棟報數的次數,用 i 來迴圈(1,2,3...t)a與i的關係是a = i * n + 1;稍改程式即可。

不過,我的程式還是不對,無非就是這兩句程式x0 = x0 + (i * n + 1)* n - n*(n + 1)/2; x = x0%k; sum += x;這個看似正確,其實在對x0取模以後還要再賦值給x0,以便下次使用。因為 sum %d = (a%d +b%d)%d !=(a+b)%d,一定要根據題目中的規定來。改了之後還是不對,我頹了,感覺心累,然而,此時我靈光一現,把資料都改為longlong型別,然後就正確了!!!**如下,**中大量的注釋記錄了我的思考過程,一點也不捨得刪掉。

1 #include2

3int

main()415

cout

16for(i = 1;i < t;i++)

1724 printf("

%i64d\n

",sum);

25return0;

26 }

**二我在網上還看到了乙個**,遞推公式和我並不一樣,但是提交也對了。題目中只有6個測試資料,也許並不能真正檢測。網上**如下:

1 #include2

intmain()

312 printf("

%i64d\n

",total);

13return0;

14 }

**三

今天做了幾個題大賽的

第四章 quicksum include include using namespace std int main cout include using namespace std int main cout include using namespace std int main cout inc...

Hankson的趣味題(藍橋杯)

時間限制 1 sec 記憶體限制 128 mb 提交 命題人 外部匯入 題目描述hanks 博士是bt bio tech,生物技術 領域的知名專家,他的兒子名叫hankson。現 在,剛剛放學回家的hankson 正在思考乙個有趣的問題。今天在課堂上,老師講解了如何求兩個正整數c1 和c2 的最大公...

藍橋杯 提高題 母牛的故事

有一頭母牛,它每年年初生一頭小母牛。每頭小母牛從第四個年頭開始,每年年初也生一頭小母牛。請程式設計實現在第n年的時候,共有多少頭母牛?輸入資料由多個測試例項組成,每個測試例項佔一行,包括乙個整數n 0對於每個測試例項,輸出在第n年的時候母牛的數量。每個輸出佔一行。245 02 46這題我直接模擬的,...