题目背景
自2009年以来,A、B站的历史就已经步入了农业变革的黎明期。
在两站的娱乐及音乐区,金坷垃制造业早已得到长足的发展,甚至有些地方还出现了坷垃翻唱的萌芽。
新兴肥料人开始走上历史的舞台。
他们需要新的意识形态,来为他们所追求的肥料辩护;
他们需要新的理念、新的手段,来为金坷垃的生产提供支持。
这样,一种崭新的肥料精神就诞生了。
肥料复兴,是反对肥料粗制滥造,追求创新的新肥料文化的运动。
它必将成为推动金坷垃走得更远、飞得更高的重要力量。
题目描述
现在,你有n亩的小麦地需要增产,你拥有一些金坷垃,但是金坷垃极其稀少,掺肥料也只够你撒K次。
众所周知,金坷垃能激活土壤深处的氮磷钾,同一块地可以撒多次肥料,但是效果是有略微衰减的。
实地考察后你发现,第i亩土地第x次撒肥料增产a[i]-x+1公斤。
hzwer将代替你去撒肥料,但是他是个蒟蒻,完全不动大脑,所以你想知道如果他随机撒肥料,最坏情况下小麦将增产多少,最好情况下将增产多少?(他最多只会对第i亩地撒肥料a[i]次)
输入格式
第一行两个整数n,K
第二行n个整数,第i个整数为a[i]
输出格式
输出最大值,最小值,空格隔开
样例数据 1
备注
对于30%的数据n,k<=1000
对于70%的数据n,k<=200000
对于100%的数据n,k,a[i]<=1000000
题意是有n个数的序列,一次取一个数加入答案中,然后这个数的权值减1
求答案的最大值和最小值
首先最小值很简单,从小到大排序完贪心
求最大值的时候要求找出当前序列的最大值,然后一直取它取到它不再是最大值
显然堆维护一下就好了
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<deque> #include<set> #include<map> #include<ctime> #define LL long long #define inf 0x7ffffff #define pa pair<int,int> #define pi 3.1415926535897932384626433832795028841971 using namespace std; int n,m; LL ans1,ans2,des; LL a[1000010]; inline LL read() { LL x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int main() { n=read();m=read(); for (int i=1;i<=n;i++)a[i]=read(); sort(a+1,a+n+1); des=m; for (int i=1;i<=n;i++) { if (des>=a[i]) { ans1+=a[i]*(a[i]+1)/2; des-=a[i]; }else { ans1+=(2*a[i]-des+1)*des/2; break; } } make_heap(a+1,a+n+1); des=m; while (des!=0) { int now=a[1]; pop_heap(a+1,a+n+1); if (now-a[1]<des) { des-=now-a[1]+1; ans2+=(now+a[1])*(now-a[1]+1)/2; a[n]=a[1]-1; push_heap(a+1,a+n+1); }else { ans2+=(2*now-des+1)*des/2; des=0; push_heap(a+1,a+n+1); } } printf("%lld %lld ",ans2,ans1); }