洛谷1414 又是畢業季II
阿新 • • 發佈:2017-06-06
names name efi 而且 畢業 背景 畢業季 its 一個數
題目背景
“叮鈴鈴鈴”,隨著高考最後一科結考鈴聲的敲響,三年青春時光頓時凝固於此刻。畢業的欣喜怎敵那離別的不舍,憧憬著未來仍毋忘逝去的歌。1000多個日夜的歡笑和淚水,全凝聚在畢業晚會上,相信,這一定是一生最難忘的時刻!
題目描述
彩排了一次,老師不太滿意。當然啦,取每位同學的號數來找最大公約數顯然不太合理。於是老師給每位同學評了一個能力值。於是現在問題變為,從n個學生中挑出k個人使得他們的默契程度(即能力值的最大公約數)最大。但因為節目太多了,而且每個節目需要的人數又不知道。老師想要知道所有情況下能達到的最大默契程度是多少。這下子更麻煩了,還是交給你吧~
PS:一個數的最大公約數即本身。
輸入輸出格式
輸入格式:第一行一個正整數n。
第二行為n個空格隔開的正整數,表示每個學生的能力值。
輸出格式:總共n行,第i行為k=i情況下的最大默契程度。
輸入輸出樣例
輸入樣例#1:4 1 2 3 4輸出樣例#1:
4 2 1 1
說明
【題目來源】
lzn原創
【數據範圍】
記輸入數據中能力值的最大值為inf。
對於20%的數據,n<=5,inf<=1000
對於另30%的數據,n<=100,inf<=10
對於100%的數據,n<=10000,inf<=1e6
思路就是求出每個因數出現的個數,從後往前看滿不滿足即可~
#include<bits/stdc++.h> #define maxn 3000000 using namespace std; int n,m; int book[maxn],a[maxn]; int p; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; p=max(p,a[i]); int h=int(sqrt(a[i])+0.5); for(int j=1;j<=h;j++) { if(a[i]%j==0) { book[j]++; if(j*j!=a[i]) book[a[i]/j]++; } } } for(int i=1;i<=n;i++) { while(book[p]<i) p--; cout<<p<<endl; } return 0; }
洛谷1414 又是畢業季II