【题解】sdoj2594(2018-08-17集训T1)模拟

35 篇文章 0 订阅
25 篇文章 0 订阅

题目链接
反思一下自己的代码能力,比赛时打了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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值