poj--1064
阿新 • • 發佈:2018-09-05
std iostream 思想 div 答案 i++ 二分查找 二分 ons
題意:有N條繩子,它們的長度分別為Li。如果從它們中切割出K條長度相同的繩子的話,這K條繩子最長能有多長?答案保留到小數點後2位。
思路:這些最大最小化問題大多數可以用二分查找的方法來解題
用 d 表示繩子最長可以為d,然後循環利用二分搜索使得中間值不斷地縮小直到到達想要的精度
就是
void solve() { int low=0; int high=INF; for(int i=0;i<100;i++){ int mid=(low+high)/2; if (is_ok(mid)) low=mid;else high=mid; } printf("%.2f\n",floor(high*100)/100); }
下面是完整的代碼
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int K,N; const int INF=99999; double line[10001]; bool is_ok(double x)//用來判斷這個值是否能使條件成立 { int num=0; for(int i=0;i<N;i++) { num+=(int)(line[i]/x); } return num>=K; } void solve() { double low=0; double high=INF; for(int i=0;i<100;i++) { /* 這個思想是二分查找, 這是利用二分查找不斷地是條件精確到需要的地步 就像用100次的循環就是使mid的值不斷地縮小 從而找出相對精確的中間值很巧妙 */ double mid=(low+high)/2; if(is_ok(mid)) low=mid; else high=mid; } printf("%.2f\n",floor(high*100)/100); } int main() { while(cin>>N>>K) { for(int i=0;i<N;i++) cin>>line[i]; solve(); } return 0; }
poj--1064