zoukankan      html  css  js  c++  java
  • codecomb 2085【肥得更高】

    题目背景

    自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
    ",ans2,ans1);
    }
    

     

    ——by zhber,转载请注明来源
  • 相关阅读:
    Linux调整时区和同步时间
    wget命令
    apt-get损坏修复
    apt-get卸载命令
    apt-get命令
    ps命令
    卸载Ambari
    YARN Registry DNS启动提示“53端口被占用”错误的解决方法
    反转链表,时间复杂度O(n),空间复杂度O(1)
    简易版之最短距离
  • 原文地址:https://www.cnblogs.com/zhber/p/4035878.html
Copyright © 2011-2022 走看看