题解 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;
}