【jzoj4821】【打膈膜】

来源:互联网 发布:软件系统安全策略 编辑:程序博客网 时间:2024/06/07 05:19

题目大意

这里写图片描述

解题思路

贪心,先攻击生命小的,场上人数大于3时用群伤,否则用重击,如果重击生命小于2则换一个重击。

code

#include<set>#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#define LF double#define LL long long#define max(n1,n2) ((n1>n2)?n1:n2)#define min(n1,n2) ((n1>n2)?n2:n1)#define num(n1,n2) ((n1-1)*3*n+n2+1)#define fo(i,j,k) for(int i=j;i<=k;i++)#define fd(i,j,k) for(int i=j;i>=k;i--)using namespace std;int const maxn=100000,inf=2147483647;int n,m,all,tmp,a[maxn+10];int main(){    freopen("d.in","r",stdin);    freopen("d.out","w",stdout);    scanf("%d%d",&n,&m);    fo(i,1,n)scanf("%d",&a[i]);    sort(a+1,a+n+1);    if((n==2)&&(a[1]==1))swap(a[1],a[2]);    LL ans=0;    fo(i,1,n){        a[i]-=all;        if(!a[i])ans--;        if(a[i]){            if(i>n-2){                tmp=min(m,a[i]/2);                m-=tmp;                ans+=1ll*tmp*(n-i+1);                a[i]-=tmp*2;                if((a[i]==0)&&tmp)ans--;                else ans+=1ll*(a[i]-1)+a[i]*(n-i);            }else{                all+=min(m,a[i]);                m-=min(m,a[i]);                ans+=1ll*a[i]*(n-i+1)-1;            }        }    }    printf("%lld",ans);    return 0;}
0 0
原创粉丝点击