POJ 1064 分割线缆(二分查找)
发布日期:2021-07-01 03:39:40 浏览次数:2 分类:技术文章

本文共 3078 字,大约阅读时间需要 10 分钟。

题目链接:

题目大意:多根电缆切成指定段数(每段相同长度),求每段线缆的最大长度(精确到0.01)

这题精度控制是难点,方法很简单,二分查找

Wrong Answer 代码

/** * @description: poj1064,多根电缆切成指定段数(相同长度),求每段最大长度 * @author: michael ming * @date: 2019/5/2 15:14 * @modified by:  */#include 
#include
#include
#include
using namespace std;int main(){
int cables, target, cable_we_get; cin >> cables >> target; double minlen = 0.0, maxlen = 100000, mid, len[10001]; for(int i = 0; i < cables; ++i) {
// cin >> len[i]; scanf("%lf", &len[i]);// len[i] += 1E-15;// maxlen = maxlen > len[i] ? maxlen : len[i]; } while(maxlen - minlen > 1E-3) {
cable_we_get = 0; mid = minlen + (maxlen - minlen)/2; for(int i = 0; i < cables; ++i) {
cable_we_get += (int)(len[i]/mid); } if(cable_we_get >= target) minlen = mid; else maxlen = mid; }// mid = double(floor(mid*100))/100.0;// cout << fixed << setprecision(2) << mid << endl; printf("%.2lf\n", floor(mid*100)/100); return 0;}

Accepted 代码(修改部分见代码最后注释)

在这里插入图片描述

/** * @description: poj1064,多根电缆切成指定段数(相同长度),求每段最大长度 * @author: michael ming * @date: 2019/5/2 15:14 * @modified by:  */#include 
#include
#include
#include
using namespace std;int main(){
int cables, target, cable_we_get; cin >> cables >> target; double minlen = 0.0, maxlen = 100000, mid, len[10001]; for(int i = 0; i < cables; ++i) {
cin >> len[i];// scanf("%lf", &len[i]); } while(maxlen - minlen > 1E-3) {
cable_we_get = 0; mid = minlen + (maxlen - minlen)/2; for(int i = 0; i < cables; ++i) {
cable_we_get += (int)(len[i]/mid); } if(cable_we_get >= target) minlen = mid; else maxlen = mid; } cout << fixed << setprecision(2) << floor(maxlen*100)/100.0 << endl;// printf("%.2lf\n", floor(maxlen*100)/100);// 以上两种写法都可以AC,但是注意表达式内不要写mid,要写maxlen// 最后如果是mid=1.999,保留两位,直接是1.99// maxlen是2.001,直接保留2.00 return 0;}

另一种解法:把数据都放大100倍,这样都是整型了

在这里插入图片描述

/** * @description: poj1064 数字放大100倍做法,输入浮点数分成整数部分和小数部分,避免1.50输入后变成1.4999999 * @author: michael ming * @date: 2019/5/2 20:00 * @modified by:  */#include 
using namespace std;int main(){
int cables, target, cable_we_get; cin >> cables >> target; int minlen = 1, maxlen = 10000000, mid, len[10001], ans; int int_part, float_part; char ch; for(int i = 0; i < cables; ++i) {
cin >> int_part >> ch >> float_part; len[i] = int_part * 100 + float_part; } while(maxlen - minlen >= 0) {
cable_we_get = 0; mid = minlen + (maxlen - minlen)/2; for(int i = 0; i < cables; ++i) {
cable_we_get += len[i]/mid; } if(cable_we_get >= target) minlen = mid+1; else maxlen = mid-1; } cout << maxlen/100 << "." << (maxlen/10)%10 << maxlen%10 << endl; return 0;}

转载地址:https://michael.blog.csdn.net/article/details/89763758 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:POJ 3481 Double Queue
下一篇:python--从入门到实践--chapter 15 16 17 生成数据/下载数据/web API

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月12日 08时53分32秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章