Finally! Vasya have come of age and that means he can finally get a passport! To do it, he needs to visit the passport office, but it's not that simple. There's only one receptionist at the passport office and people can queue up long before it actually opens. Vasya wants to visit the passport office tomorrow.
He knows that the receptionist starts working after ts minutes have passed after midnight and closes aftertf minutes have passed after midnight (so that(tf?-?1) is the last minute when the receptionist is still working). The receptionist spends exactlyt minutes on each person in the queue. If the receptionist would stop working withint minutes, he stops serving visitors (other than the one he already serves).
Vasya also knows that exactly n visitors would come tomorrow. For each visitor Vasya knows the point of time when he would come to the passport office. Each visitor queues up and doesn't leave until he was served. If the receptionist is free when a visitor comes (in particular, if the PRevious visitor was just served and the queue is empty), the receptionist begins to serve the newcomer immediately.
"Reception 1"For each visitor, the point of time when he would come to the passport office is positive. Vasya can come to the office at the time zero (that is, at midnight) if he needs so, but he can come to the office only at integer points of time. If Vasya arrives at the passport office at the same time with several other visitors, he yields to them and stand in the queue after the last of them.
Vasya wants to come at such point of time that he will be served by the receptionist, and he would spend the minimum possible time in the queue. Help him!
InputThe first line contains three integers: the point of time when the receptionist begins to workts, the point of time when the receptionist stops workingtf and the time the receptionist spends on each visitort. The second line contains one integer n — the amount of visitors (0?≤?n?≤?100?000). The third line contains positive integers in non-decreasing order — the points of time when the visitors arrive to the passport office.
All times are set in minutes and do not exceed 1012; it is guaranteed thatts?<?tf. It is also guaranteed that Vasya can arrive at the passport office at such a point of time that he would be served by the receptionist.
OutputPrint single non-negative integer — the point of time when Vasya should arrive at the passport office. If Vasya arrives at the passport office at the same time with several other visitors, he yields to them and queues up the last. If there are many answers, you can print any of them.
ExamplesInput10 15 2210 13Output12Input8 17 343 4 5 8Output2NoteIn the first example the first visitor comes exactly at the point of time when the receptionist begins to work, and he is served for two minutes. At 12 minutes after the midnight the receptionist stops serving the first visitor, and if Vasya arrives at this moment, he will be served immediately, because the next visitor would only come at 13 minutes after midnight.
In the second example, Vasya has to come before anyone else to be served.
題目大意:
一個工作窗口,從ts開放到tf.工作人員很負責,只要到時間一定上崗,到時間一定離開崗位。
處理每一個人的需求需要用k時間。
現在已知這一天有N個人將要來辦理業務,來的時間已經給出。
現在主人公想要等待的時間最短,問什么時刻去最好。
思路:
1、問題的大方向很好考慮:
①要么主人公在所有人之前來,要么主人公在所有人之后來。
②再要么就是在每一個人之前一個單位時間來。
以上是所有可能的最優時間。
那么我們需要對其進行逐一判斷。
2、需要注意幾個點:
①這N個人來的時間都是此起彼伏的,有可能早來,當然,也有可能遲到。
②有可能一個人都沒有,就是N==0的情況。
③我萌一定要在結束工作之前,辦理業務。
④在最開始來的時候,時間不能為負。
.......................................................
細節很多的一個題,坑點很多...................
Ac代碼:
#include<stdio.h>#include<string.h>#include<algorithm>#include<map>using namespace std;#define ll __int64ll a[100060];int main(){ ll l,r,t; while(~scanf("%I64d%I64d%I64d",&l,&r,&t)) { map<ll,int >s; int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%I64d",&a[i]); s[a[i]]=1; } sort(a+1,a+1+n); ll wait=0x3f3f3f3f; ll output=0x3f3f3f3f; ll now; ll preend; if(a[1]-1>=0)output=a[1]-1,wait=abs(output-l);//所有人之前來 if(l<a[1])output=l,wait=0; for(int i=1;i<=n;i++) { ll tmpoutput=output; if(i==1) { if(a[i]<l)now=l; else now=a[i]; preend=now+t; } else { if(preend<a[i]) { output=preend; wait=0; } else { if(preend-(a[i]-1)<wait) { wait=preend-(a[i]-1); output=a[i]-1; } now=preend; preend=now+t; } } if(output+t>=r)output=tmpoutput; } if(preend+t<=r)output=preend;//所有人之后來 if(n==0)output=l; printf("%I64d/n",output); }}
新聞熱點
疑難解答