(File IO): input:berries.in output:berries.out
時間限制: 1000 ms 空間限制: 262144 KB 具體限制
Goto ProblemSet
題目描述
和她的妹妹 正在 的漿果園裏採漿果。 的漿果園裏有 棵漿果樹;樹 上有 個漿果。 有 個籃子(, 爲偶數)。每個籃子裏可以裝同一棵樹上採下的任意多個漿果,但是不能裝來自於不同的樹上的漿果,因爲它們的口味可能不同。籃子裏也可以不裝漿果。
想要使得她得到的漿果數量最大。但是, 希望 與她的妹妹一同分享,所以 必須將漿果數量較多的 個籃子給 。這表示 很有可能最後比 得到更多的漿果,這十分不公平,然而姐妹之間往往就是這樣。
幫助 求出她最多可以得到的漿果數量。
輸入
輸入的第一行包含空格分隔的整數 和 。
第二行包含 個空格分隔的整數 。
輸出
輸出一行,包含所求的答案。
樣例輸入
5 4
3 6 8 4 2
樣例輸出
8
數據範圍限制
測試點 滿足 。
測試點 沒有額外限制。
提示
如果 在一個籃子裏裝樹 的 個漿果
兩個籃子裏每個裝樹 的 個漿果
一個籃子裏裝樹 的 個漿果
那麼她能夠得到兩個各裝有 個漿果的籃子,總共 個漿果。
解題思路
假設 拿的籃子裏面果子數最小值爲 ,那麼最好情況是她拿的籃子裏全都是 個果子。我們可以從 到 枚舉這個 m,令能裝滿的(也就是裝了 個果子的)籃子數爲 。分類討論:
- :不能滿足最小條件,停止枚舉。
- :此時 能拿到的就是 個果子,更新答案即可。
- 這裏的關鍵是每棵樹上 在裝滿若干籃子之後 剩餘的果子數,也就是 。我們以 爲關鍵字從大到小對 a 數組排序,排序結果爲, 拿的果子數就是:
代碼
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,k,a[1010],maxn,f,ans,t,bsy;
bool cmp(int x,int y)
{
return x%t>y%t;
}
int main(){
freopen("berries.in","r",stdin);
freopen("berries.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
maxn=max(maxn,a[i]);
}
for(int i=1;i<=maxn;i++)
{
f=0;
for(int j=1;j<=n;j++)
f+=a[j]/i;
if(f<(k/2))
break;
if(f>=k)
{
ans=max(ans,i*(k/2));
continue;
}
t=i;
sort(a+1,a+n+1,cmp);
bsy=(f-k/2)*t;
for(int x=1;x<=n,x+f<=k;x++)
bsy+=a[x]%t;
ans=max(ans,bsy);
}
printf("%d",ans);
}