codeforces 767B The Queue【貪心】
阿新 • • 發佈:2019-02-04
連結:
http://codeforces.com/contest/767/problem/B
題意:
Vasya要去護照,然而接待員在【ts,tf)的時間段內上班,處理一件業務需要花費時間t,並且有n個人在T【i】的時間去辦護照,當Vasya與另一個人同時去辦護照時,Vasya排在他的後面,問Vasya什麼時候去等待的時間最少。
題解:
將n個人的辦護照的時間段都計算出來,然後因為對於Vasya來說他只要在某個人來之前的前一秒先到所花費的時間最少,還要注意判斷最後一個人辦完護照後Vasya是否還能辦護照。
#include<iostream> #include<stdio.h> #include<algorithm> #include<cmath> #include<stdlib.h> #include <string.h> #include<queue> #include<set> #include<map> #include<stack> #include<time.h> using namespace std; #define MAX_N 1000005 #define inf 0x3f3f3f3f #define LL long long #define ull unsigned long long const LL INF = 9e18; const int mod = 100000000; typedef pair<LL, LL>P; int n; LL ts, tf, t; LL T[MAX_N]; P V[MAX_N]; int main() { cin >> ts >> tf >> t; cin >> n; for(int i=1; i<=n; i++) { scanf("%lld",&T[i]); } V[0].second = -INF; for(int i=1; i<=n; i++) { if(T[i] > V[i-1].second) { if(T[i] >= ts) V[i].first = T[i]; else V[i].first = ts; V[i].second = V[i].first + t - 1; } else { V[i].first = V[i-1].second + 1; V[i].second = V[i].first + t - 1; } }/* for(int i=1; i<=n; i++) { printf("%lld %lld\n",V[i].first, V[i].second); }*/ LL minT = INF; LL ans; for(int i=1; i<=n; i++) { P tmp; if(T[i]-1 > V[i-1].second) { if(T[i]-1 >= ts) tmp.first = T[i] - 1; else tmp.first = ts; tmp.second = tmp.first + t - 1; } else { tmp.first = V[i-1].second + 1; tmp.second = tmp.first + t - 1; } if(minT>tmp.first-T[i]+1 && tmp.second<tf) { minT = tmp.first - T[i] + 1; ans = T[i] - 1; } } if(V[n].second+t<tf) ans = V[n].second + 1; if(minT != INF) printf("%lld\n",ans); else printf("%lld\n",ts); }