1. 程式人生 > >poj--1064

poj--1064

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