今天真的弱爆了。。。。这么水的问题都不会,后来看了看解题报告,才搞明白。。。。
其实就是一个简单的追逐问题,由于0<=FI<=500,任意两个人在501步以后,一定是后来速度更快的人走的更远。若两人的步幅相同,则要看F(i),若f(i)也相同,则比较id.当然,首先还是要做一个500步之内的枚举,暴力解决。。接下来按照上面所描述的排序即可。。。附代码:
#include <iostream>
using namespace std;
struct node
{
int f;
int s;
int id;
};
const int N=50010;
#define in(a) scanf("%d",&a)
node a[N];
bool cmp(node x,node y)
{
if (x.s>y.s) return 1;
else if (x.s<y.s) return 0;
else if (x.f>y.f) return 1;
else if (x.f<y.f) return 0;
else if (x.id<y.id) return 1;
else return 0;
}
int main()
{
int i,j,k,T,n;
in(T);
for (k=1;k<=T;k++)
{
in(n);
for (i=1;i<=n;i++)
{
in(a[i].f);
in(a[i].s);
a[i].id=i;
}
printf("Case #%d:\n",k);
for (i=1;i<=501;i++)
{
if (i>n) break;
int mmax=-100,mi=n+1;
for (j=1;j<=n;j++)
{
if (a[j].f!=-1)
{
if (i!=1) a[j].f+=a[j].s;
if (a[j].f>mmax)
{
mmax=a[j].f;
mi=j;
}
else if (a[j].f==mmax&&j<mi) mi=j;
}
}
printf("%d",mi);
if (i!=n) printf(" ");
else printf("\n");
a[mi].f=-1;
a[mi].s=-1;
}
if (n>501)
{
sort(a+1,a+n+1,cmp);
for (i=1;i<n-501;i++) printf("%d ",a[i].id);
printf("%d\n",a[n-501].id);
}
for (i=1;i<=n;i++)
a[i].id=a[i].s=a[i].f=0;
}
return 0;
}