Cable master POJ - 1064
题意:
就是减绳子,不过数据是输入浮点类型的绳子。
本题输入单位是m。假如找不到答案,最小的分割单位是cm,所以要对答案进行处理即可。具体看代码(假如扩大成int,就不用处理了)
反思:
一直wa。这里做一下浮点数二分的总结。
- 假如数据量小的话,可以先变成整数再二分。
- 对于题目假如说保留 n位小数,那么
eps
一般设置为 1 e ( − n − 2 ) 1e(-n-2) 1e(−n−2) - 更特别地,其实可以
直接计算100
(可能不是100次,具体多少次,根据题目而定)次得出答案。
AC1(double)
# include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = 1E5+10;
const double eps = 1e-4;
int n, m;
double a[N];
bool check(double x){
int sum =0;
for(int i = 1; i <= n; i ++ )sum += (int)(a[i]/x);
return sum>=m;
}
int main(){
cin>>n>>m;
double l = 0.001, r = 0;
for(int i =1 ; i <= n; i ++ ){
scanf("%lf",a+i);//cin>>a[i];
r= max(r, (double)a[i]);
}
double ans=0;
while(r-l>eps){
double mid = (l+r)/2;
if(check(mid))ans = mid, l = mid;
else r = mid;
}
printf("%.2f",(int)(r*100)/100.0);//注意这里对答案的处理
//printf("%.2f", ans);
return 0;
}
AC2(int)
# include <iostream>
#include <cstdio>
using namespace std;
const int N = 1E5+10;
const double eps = 1e-5;
int n, m;
int a[N];
bool check(int x){
int sum =0;
for(int i = 1; i <= n; i ++ )sum += (a[i]/x);
return sum>=m;
}
int main(){
while(cin>>n>>m){
int l=1, r=0;
for(int i =1 ; i <= n; i ++ ){
double x; //cin>>x;
scanf("%lf",&x);
a[i]=x*100.0;
r= max(r, a[i]);
}
int ans=0;
while(l<=r){
int mid = (l+r)/2;
if(check(mid))ans = mid, l = mid+1;
else r = mid-1;
}
printf("%.2f\n",0.01*ans);
}
return 0;
}