-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathServere.java
More file actions
114 lines (96 loc) · 2.94 KB
/
Servere.java
File metadata and controls
114 lines (96 loc) · 2.94 KB
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.util.StringTokenizer;
public class Servere {
private static class MyScanner {
private BufferedReader br;
private StringTokenizer st;
public MyScanner(Reader reader) {
br = new BufferedReader(reader);
}
public String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
}
public static void main(String[] args) {
try {
String inFile = "servere.in";
String outFile = "servere.out";
MyScanner scanner = new MyScanner(new FileReader(inFile));
int N = scanner.nextInt();
int[] powers = new int[N];
int minPower = Integer.MAX_VALUE;
int maxP = Integer.MIN_VALUE;
for (int j = 0; j < N; j++) {
powers[j] = scanner.nextInt();
}
int[] supplies = new int[N];
for (int j = 0; j < N; j++) {
int currentPower = scanner.nextInt();
supplies[j] = currentPower;
if (currentPower < minPower) {
minPower = currentPower;
}
if (currentPower > maxP) {
maxP = currentPower;
}
}
double minPowerr = -Double.MAX_VALUE; //for the solution
double stepSize = 0.1;
double low = minPower;
double high = maxP;
double prevMinPowerr = Double.NEGATIVE_INFINITY; //help with convergence
int numIterations = 0; //help keep track for convergence
while (low <= high) {
double mid = (low + high) / 2;
double midPlusStep = mid + stepSize;
double iminMid = calculateIndividualMinP(mid, powers, supplies);
double iminMidPps = calculateIndividualMinP(midPlusStep, powers, supplies);
minPowerr = Math.max(minPowerr, Math.max(iminMid, iminMidPps));
if (iminMidPps > iminMid) {
low = midPlusStep;
} else {
high = mid;
}
if (minPowerr == prevMinPowerr) {
numIterations++;
if (numIterations >= 100) {
break;
}
} else {
numIterations = 0;
}
prevMinPowerr = minPowerr;
}
try (BufferedWriter writer = new BufferedWriter(new FileWriter(outFile))) {
String formattedMaxPower = String.format("%.1f", minPowerr);
writer.write(formattedMaxPower + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static double calculateIndividualMinP(double k, int[] powers, int[] supplies) {
double individualMinPower = Double.MAX_VALUE;
for (int j = 0; j < powers.length; j++) {
double currentPower = powers[j];
double individualPower = currentPower - Math.abs(k - supplies[j]);
individualMinPower = Math.min(individualMinPower, individualPower);
}
return individualMinPower;
}
}