题目链接: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; }