ACM複習(24)8623 龍龍

2021-08-15 06:47:26 字數 1870 閱讀 6768

description

在比賽的時候,1y(1 次ac)是很值得高興的事情。但很多大牛總會因為很弱智的錯誤先wa 一次,再ac。

而很多時候,這點罰時的差距使得他們與金牌無緣。弱智錯誤系列中最顯著的就是忘記加龍龍。

龍龍外國人叫它作long long,表示64位整數,輸入與輸出64位整數則可以使用例如

scanf(「%lld」, &a)與printf(「%lld」, a)的形式完成。很多圖論和動態規劃的題目中,

雖然題目說最後輸出的答案是32 位的整數,但中間計算的過程有時會超過int,這時我們就要使用龍龍了。

可惜的是,很多同學剛開始學寫程式都是用vc的,在vc上是無法使用long long的,我們要用__int64

代替,輸入與輸出64位整數則可以使用例如scanf(「%i64d」, &a)與printf(「%i64d」, a)的形式完成。

但是提交上oj 的時候,如果使用gcc或g++,都只支援long long,我們在提交時又得按照上邊的改回來(的確挺麻煩,窘)。

為了讓知道龍龍的同學們記得使用龍龍,不知道的學習使用龍龍,下邊有個很簡單的函式,希望大家

求出它的返回值:

long long h(int n)

return res;

}不過直接使用這個函式是會超時的,必須改造這個函式,當然這一定難不到未來的程式設計高手——你

輸入格式

第一行是數字t(t<=1021)表示case數,接下來t 行,每行乙個整數n,n是乙個32 位整數(保證可以由int 表示)。

輸出格式

函式返回值。

輸入樣例

2 5

10輸出樣例

通過列舉資料分析發現:

1~n中的任意乙個數字 i (1 <= i <= n)都和第 i 個以及第 i + 1個商有關

以n = 25為例:

1 = 25 - 12 = 13個

2 = 12 - 8 = 4個

3 = 8 - 6 = 2個

4 = 6 - 5 = 1個

5 = 5 - 4 = 1個

6 = 4 - 3 = 1 個

7 = 3 - 3 = 0個

8 = 3 - 2 = 1個

9 = 2 - 2 = 0個

… 這個規律有什麼意義?要求出每個數字分別有多少個還不是要把所有商求出來?

其實不然,再觀察資料可以發現當第乙個重複的商(即n(i) == n(i + 1))出現時

我們已經求得1~i中每乙個數字的個數

上例中重複的商3(i = 6 and i + 1 = 7)出現時,已求得

1 = 25 - 12 = 13個

2 = 12 - 8 = 4個

3 = 8 - 6 = 2個

4 = 6 - 5 = 1個

5 = 5 - 4 = 1個

6 = 4 - 3 = 1 個

此時我們已經獲得了13 + 4 + 2 + 1 + 1 + 1 = 22個商,只需再求n - 22 = 25 - 22 = 3個商

通過這個規律可以極大的減少運算次數,也就不會超時了

#include

long

long h(int n);

int main()

return0;}

long

long h(int n)

for(i = 1; i <= n - count; i ++)

res += n / i;

return res;

}

ACM複習(34)9519 偷吃

超牛和lyd最近買了好多零食啊,可是呢,因為龍教很貪吃,經常偷吃他們的東西。為了要讓龍教吃不到,他們想到了個方法,他們叫pkkj給他們n個箱子,然後他們就把箱子排成一列,把他們買回來的三種零食 包括薯片,果凍還有餅乾 放進那裡面。然後讓龍教猜箱子裡面的食物,只有兩次機會,猜不到就沒得吃。所以他們想讓...

ACM複習(45)10680 飛機

description 某國成立了乙個新的航空公司。該公司準備採購飛機來運營屬下的兩條航線a與b。他們聯絡了一些飛機製造商,這些製造商提供了他們飛機的資料。資料裡面記錄了每種飛機的載客量,以及他們飛航線a與航線b所需要的燃油量。通過市場調查,該公司摸清了兩條航線的日均客流量。已知該航空公司每日能夠採...

ACM入門(筆試複習)指南

從大一下冊開始參加程式設計競賽,到大三下,沒給學校帶來什麼榮譽,倒是學校和老師無私的鍛鍊了我。雖然是acm出身,我一直不敢寫關於acm相關的部落格。可能內心一直覺得自己太菜了,怕大佬們笑話吧。acm知識點圖譜 這個是noip的,跟acm差不多 因為是入門 筆試複習 教程,所以我就不去整那些我自己看不...