【習題 8-14 UVA - 1616】Caravan Robbers
阿新 • • 發佈:2018-01-11
() return studio def ava div pair using href
【鏈接】 我是鏈接,點我呀:)
【題意】
在這裏輸入題意
【題解】
二分長度。
顯然長度越長。就越不可能。
二分的時候。可以不用管精度。
直接指定一個二分次數的上限就好。
判斷長度是否可行。直接用貪心就好。
->貪心(排序區間,盡量讓新的區間右端點靠左一點。以便後面的區間有放的地方。
最後得到小數。
=>暴力枚舉分母i是什麽。
然後進行類似一個叠代!?的過程。
如果round(ans*i)/i和ans的差的絕對值更小。則更新分母、分子。
【代碼】
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5;
int n;
pair<double,double> a[N+10];
bool ok(double len){
double now = a[1].first + len;
for (int i = 2;i <= n;i++){
if (a[i].first<now){
if (now+len>a[i].second) return false;
now = now + len;
}else{
//a[i].first>=now
if (a[i].first+len>a[i].second) return false;
now = a[i].first+len;
}
}
return true;
}
int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
while (cin >> n){
for (int i = 1;i <= n;i++) cin >> a[i].first>>a[i].second;
sort(a+1,a+1+n);
double l = 1,r = a[1].second-a[1].first,temp = -1;
for (int i = 1;i <= 200;i++){
double mid = (l+r)/2.0;
if (ok(mid)){
temp = mid;
l = mid;
}else r = mid;
}
ll pfenzi = 0,pfenmu = 1;
for (int i = 1;i <= 100000;i++){
ll fenzi = round(i*temp);
if ( abs((double)fenzi/(1.0*i)-temp) <abs((double)pfenzi/(1.0*pfenmu) - temp)){
pfenzi = fenzi;
pfenmu = i;
}
}
cout <<pfenzi<<"/"<<pfenmu<<endl;
}
return 0;
}
【習題 8-14 UVA - 1616】Caravan Robbers