题解 P5120 【[USACO18DEC]Convention II S】

· · 题解

分析:简单的暴力

根据题意模拟即可

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int id,a,t,s;
}a[1000005];
int n;
int cmp(node s1,node s2)
{
    if(s1.a!=s2.a)
    return s1.a<s2.a;
        return s1.id<s2.id;
}

int main(){
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    cin>>n;

    for(int i=1;i<=n;i++)
    {
        cin>>a[i].a>>a[i].t;
        a[i].s=a[i].t+a[i].a;
        a[i].id=i;
    }
    int s=0,k=1;
    sort(a+1,a+n+1,cmp);
//  for(int i=1;i<=n;i++)
//  {
//      cout<<a[i].a<<' ';
//      
//  }
    while(k<=n)
    {
        int tp=19260817,tt=0,t=k+1;
        for(int i=t;i<=n;i++)//找等候的奶牛中资历最深的
        {
//          cout<<i<<' ';
            if(a[i].a>a[k].s)
                break;
            if(a[i].id<tp)
            {
                tp=a[i].id;
                tt=i;
            }
        }
//      cout<<endl;
        if(tt!=0){//可能有为0的情况,代表没有奶牛等待
        s=max(s,a[k].s-a[tt].a);//等待时间
//      cout<<a[k].s<<' '<<a[tt].a<<' '<<a[tt].s<<' '<<a[tt].id<<' '<<s<<' '<<k<<' '<<tt<<' '<<tp<<endl;
        a[tt].s=a[k].s+a[tt].t;//吃完的结束时间
        swap(a[k+1],a[tt]);//因为享用的是奶牛tt,这是k+1好奶牛还没有享用,需要交换位置
        }
        ++k;
    }
    cout<<s;
    return 0;
}