Codeforces Round #398 (Div. 2) B

来源:互联网 发布:贪吃飒淘宝店 编辑:程序博客网 时间:2024/06/06 16:44

题目链接:http://codeforces.com/contest/767/problem/B

题意:给出营业时间段,和服务每个人的时间,以及n个人到店里的时刻,主人公想要排队等待时间最少,求应该到达店里的时刻。

解题方案:n个人排队,一共有n+1个位置可以考虑插入,将n+1分为1+(n-1)+1三段,即分为队首,队伍中间,队尾三段应用贪心的思想来分类讨论。

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <string>#include <cmath>#include <vector>#include <queue>#include <stack>#include <set>#include <map>using namespace std;#define FOR(i,k,n) for(int i=k;i<n;i++)#define FORR(i,k,n) for(int i=k;i<=n;i++)#define scan(a) scanf("%d",&a)#define scann(a,b) scanf("%d%d",&a,&b)#define scannn(a,b,c) scanf("%d%d%d",&a,&b,&c)#define mst(a,n)  memset(a,n,sizeof(a))#define ll long long#define N 100005#define mod 1000000007#define INF 0x3f3f3f3fconst long long MAX=1e12+20;const double eps=1e-8;const double pi=acos(-1.0);ll a[N];int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    ll s,e,t;    cin>>s>>e>>t;    int n;    cin>>n;    for(int i=0;i<n;i++)        cin>>a[i];    ll t1=-1,t2=-1,t3=-1;    ll ans1=MAX,ans2=MAX,ans3=MAX;    if(s-(a[0]-1)>0)    {        ans1=s-(a[0]-1);        t1=a[0]-1;    }    else    {        cout<<s<<endl; /*之前输出了a[0]-1,结果WA在最后一组数据,防不胜防啊。。                        Input                        333 500 5                        1                        3000                        Output                        333                       */        return 0;    }    for(int i=0;i<n-1;i++)    {        if(a[i]+1<a[i+1])        {            if(a[i+1]-1+t<=e)            {                ll tt=a[i+1]-1;                if(s+(i+1)*t-tt<ans2)                {                    ans2=s+(i+1)*t-tt;                    if(ans2<0) ans2=0;                    t2=tt;                    if(ans2==0)                    {                        cout<<t2<<endl;                        return 0;                    }                }            }            else break;        }    }    if(s+n*t+t<=e)    {        t3=s+n*t;        cout<<t3<<endl;        return 0;    }    if(ans1<ans2)        cout<<t1<<endl;    else        cout<<t2<<endl;    return 0;}


0 0
原创粉丝点击