题目链接
反思一下自己的代码能力,比赛时打了140行的大模拟,还自信满满结果爆零了。标程足足少100行
#include<cstdio>
#include<algorithm>
using namespace std;
#define _rep(i,a,b) for(int i=(a);i<=(b);i++)
typedef long long ll;
const int N=1e5+10;
int n,m;
int h[N];
ll ans=0;
int main()
{
scanf("%d%d",&n,&m);
_rep(i,1,n)scanf("%d",&h[i]);
sort(h+1,h+n+1);
int pos=1,cnt=n,lazy=0,d=0;
h[n+1]=2e9;
for(;;)
{
if(m>0&&(cnt>2||h[pos]-lazy-d==1))//AOE
{
m--;lazy++;//魔法-1,群攻次数+1
if(h[pos]-lazy-d<=0)//打死一个
pos++,cnt--,d=0;
while(h[pos]-lazy<=0)//群攻打死的
pos++,cnt--;
}
else
{
if(m>0)//重击
d+=2,m--;
else
{
_rep(i,pos,n)
{
ans+=(ll)(h[i]-lazy-d)*cnt-1;cnt--;
d=0;
}
break;
}
if(h[pos]-lazy-d<=0)pos++,cnt--,d=0;
}
if(pos>n)break;
ans+=cnt;
}
printf("%lld\n",ans);
return 0;
}