poj 1064

http://poj.org/problem?id=1064

题意:就是有N条线段,要分成m段,求每段最大是多少

这个题挺有意思的。二分答案(答案的区间在0.01和max(len(n))之间)。

还有一个挺有意思的,就是我发现有个案例我过不了

4 2540

8.02

7.43

4.57

5.39

这个我过不了,然后我debug的时候发现,我存的数据和这个不一样,我用Int存的,是每个扩大100倍,但是我的第一个数据变成了801

我在debug看的时候我发现了一个问题,输入8.02的值,在debug那个窗口显示的确实8.019999999,我感到很奇怪,然后查了一下,也明白了

因为数据在计算机中的存储都是以二进制来存的,但是0.2在计算机中表示不出来,那么计算机就用一个最接近它的值来表示这个数字

所以在进行扩大的时候,可以采取四舍五入的方式,这样就可以保证你在扩大的时候不会出现我这种问题,当然这个题的数据问题,不进行四舍五入也是可以过的

 1 #include <stdio.h>
 2 #include <string.h>
 3
 4
 5 int n,m;
 6 int num[10005];
 7 double x;
 8
 9 int cnt(int x)
10 {
11     int tmp = 0;
12     for(int i = 1;i<=n;i++)
13         tmp+=num[i]/x;
14     return tmp;
15 }
16
17
18 int main()
19 {
20     while(~scanf("%d%d",&n,&m))
21     {
22         int left = 1,Max = 0,ans = 0;
23         for(int i = 1;i<=n;i++)
24         {
25             scanf("%lf",&x);
26             num[i] = x*100;   //这里也可以改成(x+0.05)*100,这样更加的准确
27             if(num[i]>Max)
28                 Max = num[i];
29         }
30         while(left<=Max)
31         {
32             int mid = (left+Max)/2;
33             if(cnt(mid)>=m)
34             {
35                 left = mid+1;
36                 ans = mid;
37             }else
38             {
39                 Max = mid-1;
40             }
41         }
42         printf("%.2lf\n",ans*0.01);
43     }
44     return 0;
45 }
时间: 2024-10-11 18:13:18

poj 1064的相关文章

POJ 1064 1759 3484 3061 (二分搜索)

POJ 1064 题意 有N条绳子,它们长度分别为Li.如果从它们中切割出K条长度相同的绳子的话,这K条绳子每条最长能有多长?答案保留小数点后2位. 思路 二分搜索.这里要注意精度问题,代码中有详细说明:还有printf的%.2f会四舍五入的,需要*100再取整以截取小数点后两位. #include<stdio.h> #include<string.h> #include<string> #include<iostream> #include<math

POJ 1064 Cable master 浮点数二分

Cable master Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21181   Accepted: 4571 Description Inhabitants of the Wonderland have decided to hold a regional programming contest. The Judging Committee has volunteered and has promised to

poj 1064 Cable master ,二分 精度!!!

给出n根绳子,求把它们切割成K条等长的绳子的最大长度是多少? 二分 用 for(int i=0; i<100; ++i) 代替   while(r-l>eps) 循环100次精度能达到1e-30,基本上能一般题目的精度要求. 而 浮点数二分区间的话容易产生精度缺失导致死循环. #include<cstdio> double L[10000 + 10]; int n, k; int ok(double x) { int cnt = 0; for(int i=0; i<n; ++

二分搜索 POJ 1064 Cable master

题目传送门 1 /* 2 题意:n条绳子问切割k条长度相等的最长长度 3 二分搜索:搜索长度,判断能否有k条长度相等的绳子 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 using namespace std; 10 11 const int MAXN = 1e4 + 10; 12 const int INF = 0x3f3f

POJ 1064 Cable master(二分查找+精度)(神坑题)

POJ 1064 Cable master 一开始把 int C(double x) 里面写成了  int C(int x) ,莫名奇妙竟然过了样例,交了以后直接就wa. 后来发现又把二分查找的判断条件写错了,wa了n次,当 c(mid)<=k时,令ub=mid,这个判断是错的,因为要找到最大切割长度,当满足这个条件时,可能已经不是最大长度了,此时还继续缩小区间,自然就wa了,(从大到小递减,第一次满足这个条件的值,就是最大的值),正确的判断是当 c(mid)<k时,令ub=mid,这样循环1

POJ 1064 (二分)

题目链接: http://poj.org/problem?id=1064 题目大意:一堆棍子可以截取,问要求最后给出K根等长棍子,求每根棍子的最大长度.保留2位小数.如果小于0.01,则输出0.00 解题思路: 根据最长的棍子二分枚举切割长度. 这点很容易想到. 本题麻烦的地方在于小数的二分. 由于精度丢失问题,如果直接使用double进行二分,那么二分确定的最大长度必然是不精确的. 如:只有1根100.0的棍子,分成10段.如果使用double二分,那么就算把精度控制到0.0000001, 最

POJ 1064 Cable master (二分 分数化整数)

Cable master Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28764   Accepted: 6091 Description Inhabitants of the Wonderland have decided to hold a regional programming contest. The Judging Committee has volunteered and has promised to

POJ 1064 Cable master(初遇二分)

题目链接:http://poj.org/problem?id=1064 题意:有n条绳子,他们的长度是Li,如果从他们中切割出K条长度相同的绳子,这相同的绳子每条有多长,输出至小数点后两位 " then the output file must contain the single number "0.00" (without quotes)."不是四舍五入到两位,一般四舍五入题目会说"bounded to"的提示 显然想得到的绳子越短就越能得到

POJ 1064 Cable master (二分答案)

题目链接:http://poj.org/problem?id=1064 有n条绳子,长度分别是Li.问你要是从中切出m条长度相同的绳子,问你这m条绳子每条最长是多少. 二分答案,尤其注意精度问题.我觉得关于浮点数的二分for循环比while循环更好一点.注意最后要用到floor 保证最后答案不会四舍五入. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 using namespace std;