1. 程式人生 > >GCD問題 洛谷P1372 又是畢業季I & P1414 又是畢業季II

GCD問題 洛谷P1372 又是畢業季I & P1414 又是畢業季II

青春 輸出格式 需要 span 最大值 學生 來源 不知道 code

P1372 又是畢業季I

題目背景

“叮鈴鈴鈴”,隨著高考最後一科結考鈴聲的敲響,三年青春時光頓時凝固於此刻。畢業的欣喜怎敵那離別的不舍,憧憬著未來仍毋忘逝去的歌。1000多個日夜的歡笑和淚水,全凝聚在畢業晚會上,相信,這一定是一生最難忘的時刻!

題目描述

為了把畢業晚會辦得更好,老師想要挑出默契程度最大的k個人參與畢業晚會彩排。可是如何挑呢?老師列出全班同學的號數1,2,……,n,並且相信k個人的默契程度便是他們的最大公約數(這不是迷信哦~)。這可難為了他,請你幫幫忙吧!

PS:一個數的最大公約數即本身。

輸入輸出格式

輸入格式:

兩個空格分開的正整數n和k。(n>=k>=1)

輸出格式:

一個整數,為最大的默契值。

輸入輸出樣例

輸入樣例#1:
4 2
輸出樣例#1:
2

說明

【題目來源】

lzn原創

【數據範圍】

對於20%的數據,k<=2,n<=1000

對於另30%的數據,k<=10,n<=100

對於100%的數據,k<=1e9,n<=1e9(神犇學校,人數眾多)

這道題一開始感覺很茫然,覺得這種問題應該能歸納結論,然後開始暴力枚舉了七八個樣例,大概猜到了結論。

答案應該是[n/k],由於C++自動是向下取整,所以就不用過多處理了。

下面給出證明:

設最大默契值為public,選出的k個數組成的數列為{ak};

顯然有a1

≤1*public,a2≤2*public,......,ak≤k*public;

又有an≤n;

顯然得證

1 #include<iostream>
2 using namespace std;
3 int n,k;
4 int main(){
5     cin>>n>>k;
6     cout<<n/k<<endl;
7     return 0;
8 }

P1414 又是畢業季II

題目背景

“叮鈴鈴鈴”,隨著高考最後一科結考鈴聲的敲響,三年青春時光頓時凝固於此刻。畢業的欣喜怎敵那離別的不舍,憧憬著未來仍毋忘逝去的歌。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

不難想到k個數的公約數等價於是這k個數均含有某個因數,然後就顯然了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath> 
 6 using namespace std;
 7 int n,a,mx,g,cnt[1000010];
 8 int main(){
 9     scanf("%d",&n);
10     for(int i=1;i<=n;i++){
11         scanf("%d",&a);
12         mx=max(mx,a);
13         g=sqrt(a);
14         for(int j=1;j<=g;j++)
15             if(a%j==0){
16                 cnt[j]++;
17                 if(j*j!=a) cnt[a/j]++;//這個地方要優化一下循環,到sqrt(a),否則TLE 
18             }
19     }
20     for(int i=1;i<=n;i++){
21         while(cnt[mx]<i) mx--;
22         printf("%d\n",mx);
23     }
24     return 0;
25 }

GCD問題 洛谷P1372 又是畢業季I & P1414 又是畢業季II