1. 程式人生 > >【習題 8-14 UVA - 1616】Caravan Robbers

【習題 8-14 UVA - 1616】Caravan Robbers

() 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