• 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,m,a,d);
        long long x=d/a+1;
        //printf("x=%lld
    ",x);
        long long ma=0;
        rep(i,1,m)
        {
            scanf("%lld",&t[i]);
            if(t[i]>ma) ma=t[i];
           // printf("t[i]=%lld
    ",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
    ",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
    ",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
    ",now,i,ans,cnt);
                    ans++;
                    now=t[i]+d;
                }
            }
        }
        printf("%lld
    ",ans-1);
        return 0;
    }
  • 相关阅读:
    Feli的生日礼物
    session cookie
    ArcGIS FLEXnet Licensing error:96,491错误解决
    CSS块元素与内联元素(转)
    铝伯世
    netsh修改IP及DNS

    JAVA代码查错(转)
    windows7查看占用端口的进程
    php 中文字符串截取子串
  • 原文地址:https://www.cnblogs.com/zhixingr/p/8007342.html
Copyright © 2020-2023  润新知