现在的位置: 首页 > 综合 > 正文

codecomb 2085【肥得更高】

2018年01月12日 ⁄ 综合 ⁄ 共 1628字 ⁄ 字号 评论关闭

题目背景

自2009年以来,A、B站的历史就已经步入了农业变革的黎明期。
在两站的娱乐及音乐区,金坷垃制造业早已得到长足的发展,甚至有些地方还出现了坷垃翻唱的萌芽。
新兴肥料人开始走上历史的舞台。
他们需要新的意识形态,来为他们所追求的肥料辩护;
他们需要新的理念、新的手段,来为金坷垃的生产提供支持。
这样,一种崭新的肥料精神就诞生了。
肥料复兴,是反对肥料粗制滥造,追求创新的新肥料文化的运动。
它必将成为推动金坷垃走得更远、飞得更高的重要力量。

题目描述

现在,你有n亩的小麦地需要增产,你拥有一些金坷垃,但是金坷垃极其稀少,掺肥料也只够你撒K次。

众所周知,金坷垃能激活土壤深处的氮磷钾,同一块地可以撒多次肥料,但是效果是有略微衰减的。

实地考察后你发现,第i亩土地第x次撒肥料增产a[i]-x+1公斤。

hzwer将代替你去撒肥料,但是他是个蒟蒻,完全不动大脑,所以你想知道如果他随机撒肥料,最坏情况下小麦将增产多少,最好情况下将增产多少?(他最多只会对第i亩地撒肥料a[i]次)

输入格式

第一行两个整数n,K

第二行n个整数,第i个整数为a[i]

输出格式

输出最大值,最小值,空格隔开

样例数据 1

输入  [复制]

5 10 
10 3 3 1 2

输出

58 26

备注

对于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\n",ans2,ans1);
}

抱歉!评论已关闭.