I think that testing every boundary line might be slow, but it's the only way I can think of that does it completely.
milktemp.cpp
#include <iostream>
#include <fstream>
#include <set>
#define loopi(x) loop_start(i,x,0)
#define loopj(x) loop_start(j,x,0)
#define loop_start(i, x,s) for(int i = (s); i < (x); ++i)
#define loop_rev(a,x,stop) for(int a = (x); a >= (stop); --a)
using namespace std;
int N, X, Y, Z;
int main() {
ofstream fout ("milktemp.out");
ifstream fin ("milktemp.in");
// get input
fin >> N >> X >> Y >> Z;
// calculate
int *a = new int[N], *b = new int[N];
set<int> boundaries;
loopi(N) {
fin >> a[i] >> b[i];
boundaries.insert(a[i]);
boundaries.insert(b[i]);
}
int best_score = 0, best_suitable = 0;
for (set<int>::iterator it = boundaries.begin(); it != boundaries.end(); ++it) {
int too_low = 0, too_high = 0, suitable = 0;
loopi(N) {
if(a[i] > *it)
++too_low;
else if(b[i] < *it)
++too_high;
else
++suitable;
}
// The best solution has as many as possible in the suitable range
if(suitable < best_suitable)
continue;
best_suitable = suitable;
// Update best score
const int new_score = X * too_low + Y * suitable + Z * too_high;
if(new_score > best_score)
best_score = new_score;
}
// Write output
fout << best_score;
// Clean up
delete[] a;
delete[] b;
return 0;
}
No comments:
Post a Comment