2017-2018 ACM-ICPC, NEERC A题Automatic Door 挺棘手的模拟

题目链接:http://codeforces.com/contest/883/problem/A

题意大致就是有一个门,有n个人有规律的来,时刻分别是a,2a,3a.....na。有m个人无规律的来,时刻分别为t1,t2,t3...tm.

每当有人来了门就会立刻打开并持续开d个时间单位,在闭门的那一个时刻可以有人进入并不会触发门的再次打开。

数据范围:

a<=10^9,m<=10^5,d<=10^18

ti<=10^18

 

思路比较简单,枚举考虑m个无规律的来的人,推一下从第i个无规律来的人到第i+1个无规律来的人之间开门次数的公式。

然后实现。。我WA了好多好多次。

 AC代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int MAXN=110000;
long long n,a,m,d;
long long t[MAXN];
int main()
{
   // freopen("in.txt","r",stdin);
    long long ans=0,now=0;
    scanf("%lld%lld%lld%lld",&n,&m,&a,&d);
   // printf("%lld %lld %lld %lld\n",n,m,a,d);
    long long x=d/a+1;
    //printf("x=%lld\n",x);
    long long ma=0;
    rep(i,1,m)
    {
        scanf("%lld",&t[i]);
        if(t[i]>ma) ma=t[i];
       // printf("t[i]=%lld\n",t[i]);
    }
    t[m+1]=max(n*a+d+d,ma+d+d);
    sort(t+1,t+m+2);
    if(t[1]<a)
    {
        ans++;
        now=t[1]+d;
    }
    else
    {
        ans++;
        now=a+d;
    }
    long long tmp=now/a+1;
    long long temp;
    bool flag=0;long long cnt;
    rep(i,1,m+1)
    {
       // printf("t[%d]=%lld tmp=%lld now=%lld ans=%lld\n",i,t[i],tmp,now,ans);
        if(tmp>n)
        {
            cnt=i;
            flag=1;
            break;
        }
        if(t[i]<=now) continue;
        if(t[i]<=tmp*a)
        {
            ans++;
            now=t[i]+d;
            tmp=now/a+1;
        }
        else
        {
            temp=min(t[i]/a,n);
            temp=temp-tmp;
            ans+=temp/x+1;
            now=(tmp+(temp/x+1)*x)*a-a+d%a;
            tmp=tmp+(temp/x+1)*x;
           // printf(" warn t[%d]=%lld tmp=%lld now=%lld ans=%lld\n",i,t[i],tmp,now,ans);
            if(t[i]<=now) continue;
            else
            {
                ans++;
                now=t[i]+d;
                tmp=now/a+1;
            }
        }
    }
    if(flag)
    {
        rep(i,cnt,m+1)
        {
            if(t[i]<=now) continue;
            else
            {
              //  printf("why now=%lld i=%d ans=%lld cnt=%d\n",now,i,ans,cnt);
                ans++;
                now=t[i]+d;
            }
        }
    }
    printf("%lld\n",ans-1);
    return 0;
}

 

 

posted on 2017-12-08 22:32  缄默火  阅读(415)  评论(0编辑  收藏  举报

导航