hust The mell hell
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); } }