(紀中)2416. Berry Picking【數學】

(File IO): input:berries.in output:berries.out
時間限制: 1000 ms 空間限制: 262144 KB 具體限制
Goto ProblemSet


題目描述
BessieBessie 和她的妹妹 ElsieElsie 正在 FarmerJohnFarmer John 的漿果園裏採漿果。FarmerJohnFarmer John 的漿果園裏有 NN棵漿果樹1N1000(1≤N≤1000);樹 ii 上有 BiBi 個漿果1Bi1000(1≤Bi≤1000)BessieBessieKK個籃子(1K10001≤K≤1000KK 爲偶數)。每個籃子裏可以裝同一棵樹上採下的任意多個漿果,但是不能裝來自於不同的樹上的漿果,因爲它們的口味可能不同。籃子裏也可以不裝漿果。
BessieBessie 想要使得她得到的漿果數量最大。但是,FarmerJohnFarmer John 希望 BessieBessie 與她的妹妹一同分享,所以 BessieBessie 必須將漿果數量較多的 K/2K/2 個籃子給 ElsieElsie。這表示 ElsieElsie 很有可能最後比 BessieBessie 得到更多的漿果,這十分不公平,然而姐妹之間往往就是這樣。
幫助 BessieBessie 求出她最多可以得到的漿果數量。


輸入
輸入的第一行包含空格分隔的整數 NNKK
第二行包含 NN 個空格分隔的整數 B1,B2,,BNB1,B2,…,BN

輸出
輸出一行,包含所求的答案。


樣例輸入
5 4
3 6 8 4 2

樣例輸出
8


數據範圍限制
測試點 131-3 滿足 K10K≤10
測試點 4104-10 沒有額外限制。


提示
如果 BessieBessie 在一個籃子裏裝樹 2266 個漿果
兩個籃子裏每個裝樹 3344 個漿果
一個籃子裏裝樹 4444 個漿果
那麼她能夠得到兩個各裝有 44 個漿果的籃子,總共 88 個漿果。


解題思路
假設 ElsieElsie 拿的籃子裏面果子數最小值爲 mm,那麼最好情況是她拿的籃子裏全都是 mm 個果子。我們可以從11maxmax aia_i枚舉這個 m,令能裝滿的(也就是裝了 mm 個果子的)籃子數爲 LL。分類討論:

  • L<2KL< 2K:不能滿足最小條件,停止枚舉。
  • LKL≥K:此時 BessieBessie 能拿到的就是 mK/2mK/2個果子,更新答案即可。
  • 這裏的關鍵是每棵樹上 在裝滿若干籃子之後 剩餘的果子數,也就是 aimoda_i mod mm。我們以 aimoda_i mod mm爲關鍵字從大到小對 a 數組排序,排序結果爲,BessieBessie 拿的果子數就是:
    在這裏插入圖片描述

代碼

#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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章