ZOJ-#3464 Rugby Football(贪心)

       题目大意:有n个人,有不同的速度,从起跑线出发,可以不同时,但每个人拿球的时间不能超过t,球只能水平以及向后传递。问最短跑到达阵区的时间是多少,不能完成输出-1.

      解题思路:由题意可知,应该尽量让速度快的跑完整个时间,而不用考虑速度快的何时起跑以及怎样衔接,因为速度快的始终能够达到接球时所需要的状态。直接贪心就可以了,详见code。

      题目来源:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3464

      code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAXN = 1e4;
int n,rp;
double t,l,s;
double ans;
int v[MAXN];

int main(){
    //freopen("input.txt","r",stdin);
    scanf("%d",&rp);
    while(rp--){
        memset(v,0,sizeof(v));
        scanf("%d%lf%lf",&n,&t,&l);
        s=0;ans=0;
        for(int i=0;i<n;i++){
            scanf("%d",v+i);
            s+=v[i];
        }
        if(s*t<l){printf("-1\n");continue;} //所有人都不能完成,则输出-1
        sort(v,v+n);
        for(int i=n-1;i>=0;i--){
            if(v[i]*t>=l){ans+=l/v[i];break;} //最快的那个人就可以跑完
            if(v[i]*t<=l){ //让速度最快的最后跑完所有时间
                ans+=t;
                l-=v[i]*t;
                if(0==l) break;
            }
            else if(l*1.0/v[i]<t){ //不足的由前面速度次慢的补上
                ans+=l*1.0/v[i];
                break;
            }
        }
        printf("%.2lf\n",ans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值