洛谷 P1414 又是畢業季II

2021-10-24 06:08:21 字數 1215 閱讀 6085

老師給每位同學評了乙個能力值。於是現在問題變為,從n個學生中挑出k個人使得他們的默契程度(即能力值的最大公約數)最大。但因為節目太多了,而且每個節目需要的人數又不知道。老師想要知道所有情況下能達到的最大默契程度是多少。這下子更麻煩了,還是交給你吧~

ps:乙個數的最大公約數即本身。

輸入格式

第一行乙個正整數n。

第二行為n個空格隔開的正整數,表示每個學生的能力值。

輸出格式

總共n行,第i行為k=i情況下的最大默契程度。

輸入輸出樣例

輸入 #1

412

34

輸出 #1

421

1

說明/提示

記輸入資料中能力值的最大值為inf。

對於20%的資料,n<=5,inf<=1000

對於另30%的資料,n<=100,inf<=10

對於100%的資料,n<=10000,inf<=1e6

簡單來說,給n個數,對從1到n的i,找到i個數使得最大公約數最大,依次輸出這個最大公約數。看到這個題沒想到什麼特別好的解法,於是想到每次二分答案,然後依次驗證。然後二分的答案會遞減,所以還可以優化一下。但一想這起碼是o(n

2)

o(n^2)

o(n2

)的,就沒浪費時間去寫了,肯定過不了。

由於這是個n選k問題,有點像揹包,就想dp。遍歷n個數,用滾動陣列f[k]表示n個數取k個的最大公約數,然後每次按取不取來推新的f[k],但是仔細一想這樣dp並不具有最優子結構。譬如78787,當前的7,計算f[3]時,如果取當前的7,之前的最大公約數是8,反而新的f[3]會變成1,所以直接否定。

然後就想到去挨個處理因子。對所有因子計算出現次數,但想到n次遍歷尋找至少i次的最大因子又是1e6*10000的,就沒多想。實際上我也知道最大因子一定是遞減的,只需要一次遍歷就可以找到所有的了。但就是沒轉過這個彎來,太菜了啊啊啊。。。有下面幾個注意點:

#include

using

namespace std;

int n;

int cnt[

1000010];

intmain()

}}int now=inf;

for(

int i=

1;i<=n;i++

)return0;

}

洛谷 P1414 又是畢業季II

題目背景 叮鈴鈴鈴 隨著高考最後一科結考鈴聲的敲響,三年青春時光頓時凝固於此刻。畢業的欣喜怎敵那離別的不捨,憧憬著未來仍毋忘逝去的歌。1000多個日夜的歡笑和淚水,全凝聚在畢業晚會上,相信,這一定是一生最難忘的時刻!題目描述 彩排了一次,老師不太滿意。當然啦,取每位同學的號數來找最大公約數顯然不太合...

又是畢業季II 洛谷p1414

叮鈴鈴鈴 隨著高考最後一科結考鈴聲的敲響,三年青春時光頓時凝固於此刻。畢業的欣喜怎敵那離別的不捨,憧憬著未來仍毋忘逝去的歌。1000多個日夜的歡笑和淚水,全凝聚在畢業晚會上,相信,這一定是一生最難忘的時刻!彩排了一次,老師不太滿意。當然啦,取每位同學的號數來找最大公約數顯然不太合理。於是老師給每位同...

洛谷P1414 又是畢業季II

我真傻,真的。這麼簡單的題都想了半天 其實挺簡單的。暴力記錄每乙個約數出現的個數。然後考慮輸出答案。可以想到,答案是逐漸變小的,而每個約數出現次數隨著其增長而減小。於是可以用一些玄學技巧來找出答案。include include include include using namespace std...