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

模拟赛 肥得更高

2018年04月24日 ⁄ 综合 ⁄ 共 1881字 ⁄ 字号 评论关闭

题目背景

自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

题解

好像数据很水,两个堆就A了。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
#define ll long long
#define MAXN 1000002
using namespace std;
int n,m,sizea,sizeb;
int c[MAXN],b[MAXN],a[MAXN];
void weiha(int w)
{
	while(w>1)
	   {int i=w>>1;
	    if(a[i]<a[w]) swap(a[i],a[w]);
	    w=i;
	   }
}
void inserta(int x)
{sizea++; a[sizea]=x; weiha(sizea);}
//-------------------------------------
void weihb(int w)
{
	while(w>1)
	   {int i=w>>1;
	    if(b[i]>b[w]) swap(b[i],b[w]);
	    w=i;
	   }
}
void insertb(int x)
{sizeb++; b[sizeb]=x; weihb(sizeb);}
//------------------------------------------------------------------------------
void heapfya(int w)
{
	int l=w<<1,r=l+1,maxw=w;
	if(l<=sizea&&a[l]>a[w]) maxw=l;
	if(r<=sizea&&a[r]>a[maxw]) maxw=r;
	if(maxw!=w)
	   {swap(a[w],a[maxw]); heapfya(maxw);}
}
void heapfyb(int w)
{
	int l=w<<1,r=l+1,minw=w;
	if(l<=sizeb&&b[l]<b[w]) minw=l;
	if(r<=sizeb&&b[r]<b[minw]) minw=r;
	if(minw!=w)
	   {swap(b[w],b[minw]); heapfyb(minw);}
}
//------------------------------------------------------------------------------
void init()
{
	scanf("%d%d",&n,&m);
	int i;
	for(i=1;i<=n;i++)
	   {scanf("%d",&c[i]);
	    inserta(c[i]); insertb(c[i]);
	   }
}
void work()
{
	int i;
	ll sumax=0,sumin=0;
	for(i=1;i<=m;i++)
	   {sumax+=a[1]; a[1]--; heapfya(1);}
	printf("%lld ",sumax);
	for(i=1;i<=m;i++)
	   {sumin+=b[1]; b[1]--;
	    if(b[1]==0)
		   {b[1]=b[sizeb]; sizeb--; heapfyb(1);}
	   }
	printf("%lld\n",sumin);
}
int main()
{
	init(); work();
	return 0;
}

抱歉!评论已关闭.