Problem C
Yoyodyne Propulsion Systems
Input: Standard Input
Output: Standard Output
Three years ago, Yoyodyne Propulsion Systems,
Inc., of the planet Tau Ceti Prime, received a generous contract from the Department
of Stellar Defense (DoSD) to provide the StarBlazers Forces with their
next-generation engines. These engines are primarily to be used for ferrying
large cargos of supplies to several outposts in the outer rim.
These engines have special properties. First of
all, they only have two speeds: zero and really-really-fast. Secondly, they do
not require any time to go from one speed to the other; They can instantly go
from zero to really-really-fast, and vice-versa.
In order to receive continued funding, Yoyodyne
must provide the DoSD with a demonstration that they have made significant
progress towards developing these engines (It's always the same old story with
government funding, isn't it?!?!). To do this, the DoSD has set up a series of
buoys in a remote part of the galaxy, and tasked Yoyodyne with navigating each
sequence of buoys given a certain amount of fuel at the start of each sequence.
The engines would keep traveling until the last bouy is reached or it runs out
of fuel, whichever occurs first. We would assume that the fuel consumtion is
uniform throughout the travel.
Assume that each mission starts at location (0,0,1).
At the start of each mission, and as each buoy is reached, the next buoy to
visit is determined by the closest buoy in the mission that has not yet been
visited. In case of a tie, the buoy information that comes first in the input
is given preference. Your job is to write a program to check if the current
prototype engines can successfully complete each mission, given certain mission
parameters, and provide some statistics about engine performance.
Input
The input to this problem consists of maximum 10 missions.
The first line of each mission consists four of
integers. The first integer, f (1 <= f <= 20,000), is the amount
of fuel (in kernels) in the tanks at the start of the mission, the next number,
b (1 <= b <= 100) is the burn-rate of the fuel in kernels per
second, the third number, r (1 <= r <= 200) defines how fast
really-really-fast is for this mission, in lightyears per second and the fourth
integer n(1<=n<=20) denotes the number of buoys in the mission.
Each of the next n lines contains three integers x,y,z (-2000<=x,y,z<=2000)
defining the (x,y,z) coordinates, in lightyears, of one buoys in this
mission. The coordinates can range from -2000 to 2000 inclusive.
If two buoys have the same coordinate they should be considered as two
different buoys, although the distance between them is zero.
The end of input is signified by a line where f=b=r=n=0..
Output
You are to output one line for each mission. The
output line begins with the word "Mission" followed by a space, the mission number, a colon, and a space. If
the mission can be completed, you are to output the word "SUCCESS!!",
followed by a space, the word "Time:", a space, the total amount of
time to complete the mission, in seconds, followed by two spaces, the word
"Traveled:", a space, the total distance traveled for this mission,
in lightyears, followed by two spaces, the words "Fuel Left:", a
space, and the amount of fuel left in the tanks, in kernels.
If the mission cannot be completed, you are to
output the word "FAILURE!!", followed by a space, the word
"Traveled:", a space, the total distance traveled for this mission,
in lightyears, followed by two spaces, the words "From Home:", a
space, the distance from the current location to the final buoy, in lightyears,
assuming you would traverse all remaining legs of the mission. All numbers in
the output (Except the serial of mission) should be rounded to two digits after
the decimal point.
Sample Input Output for
Sample Input
3 1 1 2 0 0 2 0 0 3 1 1 1 2 0 0 2 0 0 3 200 1 200 4 2000 0 0 -2000 0 0 -2000 0 0 -2000 -2000 -2000 0 0 0 0
|
Mission 1: SUCCESS!! Time: 2.00 Traveled: 2.00 Fuel Left: 1.00
Mission 2: FAILURE!! Traveled: 1.00 From Home: 1.00
Mission 3: SUCCESS!! Time: 44.14 Traveled: 8828.43 Fuel Left: 155.86
|
Problem setter: Robert W. Lindeman
Special Thanks: Shahriar Manzoor, Monirul
Hasan
題目描述:
給定起點 (0, 0, 1),每次找一個鄰近且還沒走訪過的點前進,會給燃料總量、每秒消耗多少燃料,以及可以跑多快。首先考慮可以走完所有點,會得到一條路徑。
如果燃料不足,可能會停留在點與點的中間,計算停止點到路徑最後一點的距離。
反之,輸出剩餘的燃料。
如果存在鄰近不止有一個,則選擇輸入順序最前面的。
#include <stdio.h>
#include <math.h>
int main() {
double f, b, r;
double x[105], y[105], z[105];
int n, cases = 0;
int i, j, k;
//freopen("out.txt","w+t",stdout);
while(scanf("%lf %lf %lf %d", &f, &b, &r, &n) == 4 && n) {
for(i = 0; i < n; i++)
scanf("%lf %lf %lf", &x[i], &y[i], &z[i]);
int used[105] = {};
double px = 0, py = 0, pz = 1;
double tx, ty, tz;
double travel = 0, time = 0;
double home;
int fail = 0;
for(i = 0; i < n; i++) {
double mn = 1e+30;
int idx = 0;
for(j = 0; j < n; j++) {
if(used[j]) continue;
double dist = sqrt(pow(px-x[j], 2)+pow(py-y[j], 2)+pow(pz-z[j], 2));
if(dist+1e-8 < mn) {
mn = dist;
idx = j;
}
}
used[idx] = 1;
if(f < mn/r*b && fail == 0) {
fail = 1;
home = travel + f/b*r;
tx = px + (f/b*r/mn)*(x[idx]-px);
ty = py + (f/b*r/mn)*(y[idx]-py);
tz = pz + (f/b*r/mn)*(z[idx]-pz);
}
travel += mn;
time += mn/r;
f -= mn/r*b;
px = x[idx], py = y[idx], pz = z[idx];
}
printf("Mission %d: ", ++cases);
if(fail) {
printf("FAILURE!! Traveled: %.2lf From Home: %.2lf\n", home, sqrt(pow(tx-px,2)+pow(ty-py,2)+pow(tz-pz,2)));
} else {
printf("SUCCESS!! Time: %.2lf Traveled: %.2lf Fuel Left: %.2lf\n", time, travel, f);
}
}
return 0;
}