码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4957 Poor Mitsui

时间:2014-08-18 08:02:13      阅读:328      评论:0      收藏:0      [点我收藏+]

标签:style   color   io   strong   for   amp   时间   size   

题解:记答案为ans,已知,对一个确定的顺序,计算所用的时间长短就是从最后向前计算,计算方法如下:

ans+=(p[i].b+ans*p[i].a)/(v-p[i].a)

那么,应该如何调整顺序使得答案最小呢?我们将这个式子拆开得到

ans+=p[i].b/(v-p[i].a)+(ans*p[i].a)/(v-p[i].a)

显然,与之前的ans和p[i].b/v-p[i].a有关,p[i].b/(v-p[i].a)的值越小,产生的ans就越小,那么在下一次计算时,(ans*p[i].a)/(v-p[i].a)的值就越小,所以我们按照p[i].b/p[i].a的大小排序,然后按照上面的式子计算就可以了。至于判断无法实现,就是当一个桶漏水比接水快时一定无法完成(当然那个桶需要的水量为0的情况特殊考虑

需要注意的是b==0的情况,需要的时间为0,昨晚在BestCoder就是这么被Hank的,考虑还是不够周到,T^T。

#include <cstdio>
#include <algorithm>
using namespace std;
struct bu{double a,b;}p[50];
int T,n; double v;
int cmp(bu a,bu b){return(a.b/a.a<b.b/b.a);}
int main(){
    scanf("%d",&T);
    while(T--){
        int flag=1; double ans=0;
        scanf("%d%lf",&n,&v);
        for(int i=0;i<n;i++)scanf("%lf",&p[i].a);
        for(int i=0;i<n;i++)scanf("%lf",&p[i].b);
        for(int i=0;i<n;i++)if(p[i].a>=v&&(p[i].b!=0)){flag=0;break;}
        if(flag==0){puts("-1");continue;} sort(p,p+n,cmp);
        for(int i=0;i<n;i++)if(p[i].b!=0){ans+=(p[i].b+ans*p[i].a)/(v-p[i].a);}
        printf("%.0lf\n",ans);
    }
    return 0;
}

HDU 4957 Poor Mitsui,布布扣,bubuko.com

HDU 4957 Poor Mitsui

标签:style   color   io   strong   for   amp   时间   size   

原文地址:http://www.cnblogs.com/forever97/p/3918680.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!