USACO 2012 Dec Silver
Problem 2: Wifi Setup
Farmer John’s N cows (1 <= N <= 2000) are all standing at various positions along the straight path from the barn to the pasture, which we can think of as a one-dimensional number line. Since his cows like to stay in email contact with each-other, FJ wants to install Wifi base stations at various positions so that all of the cows have wireless coverage.
After shopping around, FJ learns that the cost of a Wifi base station depends on distance it can transmit: a base station of power r costs A + B*r, where A is a fixed cost for installing the base station and B is a cost per unit of transmission distance. If FJ installs such a device at position x, then it can transmit data to any cow located in the range x-r … x+r. A base station with transmission power of r=0 is allowed, but this only provides coverage to a cow located at the same position as the transmitter.
Given the values of A and B, as well as the locations of FJ’s cows, please determine the least expensive way FJ can provide wireless coverage for all his cows.
PROBLEM NAME: wifi
INPUT FORMAT:
-
Line 1: Three space-separated integers: N A B (0 <= A, B <= 1000).
-
Lines 2..1+N: Each line contains an integer in the range 0..1,000,000 describing the location of one of FJ’s cows.
SAMPLE INPUT (file wifi.in):
3 20 5
7
0
100
INPUT DETAILS:
There are 3 cows at positions 7, 0, and 100. Installation of a base station of power r costs 20 + 5*r
OUTPUT FORMAT:
- Line 1: The minimum cost of providing wireless coverage to all cows.
SAMPLE OUTPUT (file wifi.out):
57.5
OUTPUT DETAILS:
The optimal solution is to build a base station at position 3.5 (with power 3.5) and another at position 100 (with power 0). The first base station covers cows 1 and 2, and the second covers cow 3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
ll N, A, B;
int main() {
setIO("wifi");
cin >> N >> A >> B;
vector<ll> loc(N + 1);
vector<ll> dp(N + 1);
dp[0] = 0;
FOR(i, 1, N + 1) {
cin >> loc[i];
}
sort(all(loc));
FOR(i, 1, N + 1) {
dp[i] = 1e16;
F0R(j, i + 1) {
dp[i] = min(dp[i], dp[j - 1] + 2 * A + B * (loc[i] - loc[j]));
}
}
float ans = dp[N]/2.0;
if (ans == dp[N]/2) {
printf("%d\n", dp[N]/2);
}
else {
printf("%.1f\n", ans);
}
}