您的位置:首页 > 其它

UVA 1616 - Caravan Robbers

2015-09-10 15:50 323 查看
二分找最大区间长,然后暴力搜出最优分数

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
const int maxn = 100000+10;
const double INF = 1000000.0;
const double eps = 1e-10;
int n, T;
pair<int, int> pai[maxn];

int main()
{
while(scanf("%d", &n) != EOF) {
for(int i = 0; i < n; ++i)
scanf("%d%d", &pai[i].first, &pai[i].second);
sort(pai, pai+n);
double l = 0, r = INF;
double ans = 0.0;
while(l + eps <= r) {
double mid = (l + r) / 2, v = 0;
bool is = true;
for(int i = 0; i < n && is; ++i) {
if(v < pai[i].first) v = pai[i].first;
if(v + mid > pai[i].second) is = false;
v += mid;
}
if(is) {
l = mid;
ans = max(ans, mid);
} else r = mid;
}
int rp = 0, rq = 1;
for (int p, q = 1; q <= n; q++) {
p = round(ans * q);
if (fabs((double)p / q - ans) < fabs((double)rp / rq - ans)) {
rp = p;
rq = q;
}
}
printf("%d/%d\n", rp, rq);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: