找了幾道簡單的熱熱身,感覺自己演算法還是記不住,能描述,不會寫,應該是練少了的緣故。
今天一道題交了好幾遍才對啊,明明是很簡單的題啊啊啊啊啊,算了,先回憶一下心路歷程。
題目是這樣的
問題描述
棟棟正在和同學們玩乙個數字遊戲。
遊戲的規則是這樣的:棟棟和同學們一共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**一結局顯而易見,超時。t與n很大的時候(甚至不太大的時候)因為for迴圈裡面是t*n,超時是必然的。3int
main()
415 cout
1617
return0;
18 }
當時我圖省事,上網學習了一下。有人和我有一樣的問題,並且有乙個人回答他,只關注棟棟的資料即可,不必每個資料都要求出來。(番外:回答這個問題的是我同學啊,我在問問題的時候別人已經開始回答問題了啊!!別問我怎麼知道的,誰叫他所有社交**都用的是同一張自己的**呢。)
既然只關注棟棟的資料,遞推公式就要重新推理了。以題目中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**二我在網上還看到了乙個**,遞推公式和我並不一樣,但是提交也對了。題目中只有6個測試資料,也許並不能真正檢測。網上**如下:3int
main()415
cout
16for(i = 1;i < t;i++)
1724 printf("
%i64d\n
",sum);
25return0;
26 }
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這題我直接模擬的,...