肥得更高
难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述

自2009年以来,A、B站的历史就已经步入了农业变革的黎明期。在两站的娱乐及音乐区,金坷垃制造业早已得到长足的发展,甚至有些地方还出现了坷垃翻唱的萌芽。新兴肥料人开始走上历史的舞台。他们需要新的意识形态,来为他们所追求的肥料辩护;他们需要新的理念、新的手段,来为金坷垃的生产提供支持。这样,一种崭新的肥料精神就诞生了。肥料复兴,是反对肥料粗制滥造,追求创新的新肥料文化的运动。它必将成为推动金坷垃走得更远、飞得更高的重要力量。
现在,你有n亩的小麦地需要增产,你拥有一些金坷垃,但是金坷垃极其稀少,掺肥料也只够你撒K次。众所周知,金坷垃能激活土壤深处的氮磷钾,同一块地可以撒多次肥料,但是效果是有略微衰减的。实地考察后你发现,第i亩土地第x次撒肥料增产a[i]-x+1公斤。hzwer将代替你去撒肥料,但是他是个蒟蒻,完全不动大脑,所以你想知道如果他随机撒肥料,最坏情况下小麦将增产多少,最好情况下将增产多少?(他最多只会对第i亩地撒肥料a[i]次)

输入
第一行两个整数n,K
第二行n个整数,第i个整数为a[i]
输出
输出最大值,最小值,空格隔开
输入示例
5 10
10 3 3 1 2
输出示例
58 26
其他说明
对于30%的数据n,k<=1000
对于70%的数据n,k<=200000
对于100%的数据n,k,a[i]<=1000000

最大值可以这么求:模拟k次操作,每次选出最多的a[i]来撒。

最小值可以这么求:模拟k次操作,每次选出最小的a[i]来撒。

然后因为权值范围不大,几个操作都可以O(c)来做。

#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0';
    return x*f;
}
typedef long long ll;
const int maxn=1000010;
int n,k,cnt,A[maxn],S[maxn];
ll ans1,ans2,t;
int main() {
    n=read();k=read();
    rep(i,1,n) S[A[i]=read()]++,t+=A[i];
    if(k>t) k=t;
    int cur=1000000;
    rep(i,1,k) {
        while(!S[cur]) cur--;
        ans1+=cur;S[cur]--;S[cur-1]++;         
    }
    rep(i,1,n) S[A[i]]=0;
    rep(i,1,n) S[A[i]]++;
    rep(i,1,1000000) while(S[i]--) A[++cnt]=i;
    rep(i,1,1000000) if(A[i]>=k) {
        ans2+=(ll)k*(A[i]+A[i]-k+1)/2;
        break;
    }
    else {
         ans2+=A[i]*(A[i]+1)/2;
         k-=A[i];     
    }
    printf("%lld %lld\n",ans1,ans2);
    return 0;    
}
View Code

相关文章:

  • 2022-01-23
  • 2021-05-15
  • 2021-04-18
  • 2021-08-04
  • 2021-11-14
  • 2021-04-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-04
  • 2021-09-16
相关资源
相似解决方案