本文主要是介绍【jzoj4821】【打膈膜】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目大意
解题思路
贪心,先攻击生命小的,场上人数大于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;
}
这篇关于【jzoj4821】【打膈膜】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!