http://acm.sdibt.edu.cn:8080/judge/contest/view.action?cid=573#problem/E
题意:每个人需要花费一定的时间排队买饭,
花费的时间m[i]=a[1]*a[2]*.......a[i-1]/b[i];
注意文章的这句话(B[i] < 10 < A[i]*b[i]) (Please pay attention to the range, it is useful on this problem)
m[i+1]=a[1]*a[2]*.....a[i-1]*a[i]/b[i+1]
m[i]=a[1]*a[2]*.......a[i-1]/b[i]
m[i+1]/m[i]=a[i]*b[i]/b[i+1] 又a[i]*b[i]/(b[i]*10)>1
所以m[i+1]/m[i]>1 则可知m[i]是递增的,如果无论几个人怎么排队,最后一个人的时间都是最大的
m[n]=a[1]*a[2]*......a[n-1]/b[n]*a[n]/b[n]=a[1]*a[2]*......a[n-1]*a[n]/(a[n]*b[n])
所以只要排序使a[n]*b[n]最大即可
英文翻译:
minimize the waiting time of one who spend the longest time in the queue,that is,minimize Max{ m(1),m(2),…,m(n)}.
这个意思并不是说,让等待最久的那个人排到第一个使他的所用的时间最短,而是说通过你的排列组合,在所有情况中找出某一种排列使时间最大的人所用的时间是
所有时间最大中所用时间最少的
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MN=1100;
struct Node
{
int x,y,pos;
}node[MN];
bool cmp(Node a,Node b)
{
return a.x*a.y<b.x*b.y;
}
int main()
{
int i,j,n;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&node[i].x);
node[i].pos=i;
}
for(j=0;j<n;j++)
{
scanf("%d",&node[j].y);
}
sort(node,node+n,cmp);
printf("%d\n",node[n-1].pos+1);
}
}