Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
【背景】 Wind设计了很多机器人。但是它们都认为自己是最强的,于是,一场比赛开始了~
【问题描述】
机器人们都想知道谁是最厉害的,于是它们进行如下一种比赛。每个机器人需要在最短的时间内找到自己面前的一个球,走到它
面前并绕过它,将球推进身后的球门。
首先Wind给了每个机器人一些钱,让他们去补充自己的装备,Wind给的钱恰好够补充k个装备。有如下几个装备可供补充:亮度传感
器,超声波测距,触动传感器,马达。(每种装备最多有10个)
而机器人找到球的时间=(20-亮度传感器*2)*x1,球离机器人的距离为(100-超声波测距*7)*x2,绕过球的距离为(100-触动传感器
*9)*x3,机器人的速度为(10+马达*1)*x4。换句话说,总共的时间为,找球的时间+走到球的时间+绕过球的时间+走回原地的时
间。机器人们要如何配置自己的装备才能达到最短的时间呢?
【时间限制】
每个测试点1s
【注释hint】
因为有了超声波,所以距离更加精确。
因为有了触动传感器,可以更精确的感觉到球。(有点牵强- -将就看吧。)
【输入格式】
每组测试数据只有1行5个数k,x1,x2,x3,x4 (0<=k<=40,1<=x1,x2,x3,x4<=10,且均为整数)。
【输出格式】
对每组数据输出1行为最短的时间,保留3位小数。
Sample Input
5 1 1 1 1
Sample Output
39.000
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t062
【题解】
枚举大法好。
直接四重循环每种装备有多少个就好;
那4种装备,每种增加都会减少时间.所以肯定是恰好为四种装备数总和为k的时候时间花得最少;
按照所给的公式计算时间.取最小值就好.
【完整代码】
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define rep1(i,x,y) for (int i = x;i <= y;i++)
int k;
double x1,x2,x3,x4;
double ans = -1;
int main()
{
//freopen("F:\rush.txt","r",stdin);
scanf("%d%lf%lf%lf%lf",&k,&x1,&x2,&x3,&x4);
rep1(n1,0,10)
rep1(n2,0,10)
rep1(n3,0,10)
rep1(n4,0,10)
{
if (n1+n2+n3+n4==k)
{
double temp = (20-2*n1)*x1*1.0;
temp+=((2*(100-n2*7)*x2+(100-n3*9)*x3)*1.0)/(1.0*((10+n4)*x4));
if (ans<0)
ans = temp;
else
ans = min(ans,temp);
}
else
if (n1+n2+n3+n4>k)
break;
}
printf("%.3lf
",ans);
return 0;
}