House Lawn
Description
You have just bought a new house, and it has a huge, beautiful lawn. A lawn that needs cutting. Several times. Every week. The whole summer.
After pushing the lawnmower around the lawn during the hottest Saturday afternoon in history, you decided that there must be a better way. And then you saw the ads for the new robotic lawnmovers. But which one should you buy? They all have different cutting speeds, cutting times and recharge times, not to mention different prices!
According to the advertisement, a robotic lawnmover will spend all its time either cutting the lawn or recharging its battery. Starting from a full battery, it will cut the lawn at a given rate of c square meters per minute for a cutting time of t minutes, after which it has run out of battery. Once out of battery, it will immediately start recharging. After recharging for r minutes the battery is full again and it immediately starts cutting.
You decide that in order for your lawn to look sufficiently prim and proper, the lawnmower that you buy must be powerful enough to cut your whole lawn at least once a week on average. Formally, if we start the mower fully charged at the beginning of the week and run it for exactly T weeks, it needs to cut the whole lawn at least T times, for all positive integers T. But apart from this, you have no specific requirements, so among the ones that satisfy this requirement, you will simply go for the cheapest option. For the purposes of cutting your lawn, you may make the simplifying assumption that a week is always exactly 10 080 minutes long.
Input
The first line of input contains two integers ℓ and m (1 ≤ ℓ ≤ 106, 1 ≤ m ≤ 100), the size of your lawn in square meters, and the number of lawnmowers to consider, respectively.
Then follow m lines, each containing a string n and 4 integers p, c, t, and r, separated by commas, describing a lawnmower as follows:
- n is the name of the lawnmower, a string of at most 60 printable characters (ASCII 32 to 126) excluding ‘
,
’, neither starting nor ending with a space, - 1 ≤ p ≤ 100 000 is the price of the lawnmover,
- 1 ≤ c ≤ 100 is the cutting rate in square meters per minute,
- 1 ≤ t ≤ 10 080 is the cutting time in minutes, and
- 1 ≤ r ≤ 10 080 is the recharge time in minutes.
Output
Output the name of the cheapest lawnmower capable of cutting your whole yard at least once a week on average. If several lawnmovers share the same lowest price, output all of their names, in the same order they were given in the input. If there is no such mower, output “no such mower
”.
Sample Input
7000 4
Grass Slayer 2000,9999,10,120,120
Slow-Mowe,999,1,120,240
Eco-cut X2,5499,2,25,35
Mowepower,5499,3,25,35
------------------------------------------
100000 4
Grass Slayer 2000,9999,10,120,120
Slow-Mowe,999,1,120,240
Eco-cut X2,5499,2,25,35
Mowepower,5499,3,25,35
Sample Output
Eco-cut X2
Mowepower
-----------------------------------
no such mower
题意:给你n个机器人,每个机器人有价格p,速度v,满电行走时间t和充满电所需时间r,从满足条件的机器人中选取价格最少的机器人,条件:有长为len的路,对于任意周数T,机器人都要能走T遍
思路:计算出机器人走一遍所需的时间need(包括充电时间,如果只用了部分电量,算上冲这一部分电量所需时间),当need>10080时肯定存在T= l c m ( t + r , 10080 ) lcm(t+r,10080) lcm(t+r,10080)/10080使得走完这么多周后刚好充满电,而lcm/need < T,不符合条件,当need <= 10080时,第T周T*10080/need >= T,而且因为计算need时算上了以后充电的时间,一开始是满电,等于说实际上T周中平均每圈所用时间<=need(因为可能T周后还有电量剩余,或者是充电中,等于说预支了充电时间,实际不要那么多时间)
代码:
#include<bits/stdc++.h>
using namespace std;
struct node
{
string s;
int p;
double need;
}nod[105];
int len,n;
int main()
{
while(~scanf("%d%d",&len,&n))
{
string s;
int cnt,p,v,t,r,minn = 1000000000;
char c;
getchar();
for(int i = 1;i <= n;++i)
{
s = "";
c = getchar();
p = v = t = r = cnt = 0;
while(c != '\n')
{
if(c == ',')
++cnt;
else if(cnt == 0)
s += c;
else if(cnt == 1)
p = p * 10 + c - '0';
else if(cnt == 2)
v = v * 10 + c - '0';
else if(cnt == 3)
t = t * 10 + c - '0';
else
r = r * 10 + c - '0';
c = getchar();
}
int dis = v * t;
double need = len / dis * (t+r) + len % dis * 1.0 /dis*(r+t);
nod[i].need = need,nod[i].s = s,nod[i].p = p;
if(need <= 10080)
minn = min(minn,p);
}
if(minn == 1000000000)
printf("no such mower\n");
for(int i = 1;i <= n;++i)
{
if(nod[i].p == minn && nod[i].need <= 10080)
cout << nod[i].s << endl;
}
}
return 0;
}