本文主要是介绍2020寒假【gmoj2416】【Berry Picking】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
Bessie 和她的妹妹 Elsie 正在 Farmer John 的浆果园里采浆果。Farmer John 的浆果园里有 N 棵浆果树(1≤N≤1000);树 i 上有 Bi 个浆果(1≤Bi≤1000)。Bessie 有 K 个篮子(1≤K≤1000,K 为偶数)。每个篮子里可以装同一棵树上采下的任意多个浆果,但是不能装来自于不同的树上的浆果,因为它们的口味可能不同。篮子里也可以不装浆果。
Bessie 想要使得她得到的浆果数量最大。但是,Farmer John 希望 Bessie 与她的妹妹一同分享,所以 Bessie 必须将浆果数量较多的 K/2 个篮子给 Elsie。这表示 Elsie 很有可能最后比 Bessie 得到更多的浆果,这十分不公平,然而姐妹之间往往就是这样。
帮助 Bessie 求出她最多可以得到的浆果数量。
输入
输入的第一行包含空格分隔的整数 N 和 K。
第二行包含 N 个空格分隔的整数 B1,B2,…,BN。
输出
输出一行,包含所求的答案。
样例输入
5 4
3 6 8 4 2
样例输出
8
数据范围限制
测试点 1-3 满足 K≤10。
测试点 4-10 没有额外限制。
提示
如果 Bessie 在一个篮子里装树 2 的 6 个浆果
两个篮子里每个装树 3 的 4 个浆果
一个篮子里装树 4 的 4 个浆果
那么她能够得到两个各装有 4 个浆果的篮子,总共 8 个浆果。
分析
假设 Elsie 拿的篮子里面果子数最小值为 m ,那么最好情况是她拿的篮子里全都是 m 个果子。我们可以从1 到 max ai 。
枚举这个 m,令能装满的(也就是装了 m 个果子的)篮子数为 L。分类讨论:
- L<2K:不能满足最小条件,停止枚举。
- L≥K :此时 Bessie 能拿到的就是 mK/2 个果子,更新答案即可。
这里的关键是每棵树上 在装满若干篮子之后 剩余的果子数,也就是 aimod a_i mod m 。我们以 a_i mod m为关键字从大到小对 a 数组排序,排序结果为,Bessie 拿的果子数就是:
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,k,moda,ans,maxa;
int a[100001];
bool cmp(int l,int r)
{return (l%moda)>(r%moda);
}
int main()
{freopen("berries.in","r",stdin);freopen("berries.out","w",stdout);cin>>n>>k;for(int i=0;i<n;i++){cin>>a[i];maxa=max(maxa,a[i]);}for(int i=1;i<=maxa;i++){int temp=0;for(int j=0;j<n;j++){temp+=a[j]/i;} if(temp<k/2) break;if(temp>=k){ans=max(ans,i*(k/2));continue;}moda=i;sort(a,a+n,cmp);int t=i*(temp-k/2);for(int j=0;j<n&&j+temp<k;j++){t+=(a[j]%moda);} ans=max(ans,t);}cout<<ans;fclose(stdin);fclose(stdout);return 0;
}
这篇关于2020寒假【gmoj2416】【Berry Picking】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!