poj1064

Cable master
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 77090   Accepted: 15630

Description

Inhabitants of the Wonderland have decided to hold a regional programming contest. The Judging Committee has volunteered and has promised to organize the most honest contest ever. It was decided to connect computers for the contestants using a "star" topology - i.e. connect them all to a single central hub. To organize a truly honest contest, the Head of the Judging Committee has decreed to place all contestants evenly around the hub on an equal distance from it. 
To buy network cables, the Judging Committee has contacted a local network solutions provider with a request to sell for them a specified number of cables with equal lengths. The Judging Committee wants the cables to be as long as possible to sit contestants as far from each other as possible. 
The Cable Master of the company was assigned to the task. He knows the length of each cable in the stock up to a centimeter,and he can cut them with a centimeter precision being told the length of the pieces he must cut. However, this time, the length is not known and the Cable Master is completely puzzled. 
You are to help the Cable Master, by writing a program that will determine the maximal possible length of a cable piece that can be cut from the cables in the stock, to get the specified number of pieces.

Input

The first line of the input file contains two integer numb ers N and K, separated by a space. N (1 = N = 10000) is the number of cables in the stock, and K (1 = K = 10000) is the number of requested pieces. The first line is followed by N lines with one number per line, that specify the length of each cable in the stock in meters. All cables are at least 1 meter and at most 100 kilometers in length. All lengths in the input file are written with a centimeter precision, with exactly two digits after a decimal point.

Output

Write to the output file the maximal length (in meters) of the pieces that Cable Master may cut from the cables in the stock to get the requested number of pieces. The number must be written with a centimeter precision, with exactly two digits after a decimal point. 
If it is not possible to cut the requested number of pieces each one being at least one centimeter long, then the output file must contain the single number "0.00" (without quotes).

Sample Input

4 11
8.02
7.43
4.57
5.39

Sample Output

2.00

Source

一句话题意:
给定n条长度不一的线段,问是否能均分成k段,如果不能则输出0.00.(1 = N = 10000,1 = K = 10000,每条线段的长度大于等于1,小于等于100km)
解析:
这种题目,没有明显的规律,只能尝试分段,比较快的解决方式就是二分。
由于题目不能划分K段则输出0.00,所以L=0.00,R=100*1000或者读入的最大值
读入的最大值需要比较n次得出,不如R直接取最大值,这样最多的比较次数为log(100000)<20,也就是说最多比较也没有20次。
程序:整数二分
 
#include<iostream>
#include<cstdio>
using namespace std;
int n,k;
const int maxn=10010;
int a[maxn];
int check(int  x){
    int s=0;
    for(int i=1;i<=n;i++)
        s=s+a[i]/x;
    if (s>=k)return 1;
    else return 0;
}
int main(){
    cin>>n>>k;
    double x;
    int temp0;
    for(int i=1;i<=n;i++){
        cin>>x;
        a[i]=x*100;
    }
    int l=0,r=10000000,mid;
    while (l<r){
        mid=(l+r+1)/2;
        if(check(mid))l=mid;
        else r=mid-1;
    }
    printf("%.2lf
",l/100.0);
    return 0;
}
    

 2.实数二分

赵老师,这个题为什么要用floor函数呀
不加它还不对,这是考查的什么呢
像这种题目怎么判断什么时候用,round或者floor或者ceil呢,它根本没做具体说明
如果答案是2.458的话,保留两位的话正确的答案应该是2.46还是2.45?
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,k;
const int maxn=10010;
double a[maxn];
int check(double  x){
    long long s=0;
    for(int i=1;i<=n;i++)
        s=s+int(a[i]/x);
    if (s>=k)return 1;
    else return 0;
}
int main(){
    cin>>n>>k;
    float x;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    double l=0,r=1000000,mid;
    for(int i=1;i<=100;i++){
        mid=(l+r)/2;
        if(check(mid))l=mid;
        else r=mid;//因为是实数。 不能减1.
    }
    printf("%.2lf
",floor(100*l)/100);
    return 0;
}
    

疑问?本题为什么不能用int输出呢?当然可以,但不能这样写:    printf("%.2lf ",int(100*l)/100);而可以这样printf("%.2lf ",int(100*l)/100.00);

知识补充:int强制类型转换取整函数floor() ceil() round()函数的区别

知识:在C++的头文件中有floor()和ceil()函数。在STL中还有round()函数。这三个函数的作用如下:
                              

从函数说明中可以看出,
(1) Floor()会取不大于自变量的最大整数,这样自变量是3.1或3.9是没有区别的,返回都是3;自变量是-2.1或-2.9也是没有区别的,返回都是-3;
(2) Ceil()会取不小于自变量的最大整数,这样自变量是3.1或3.9,返回都是4;自变量是-2.1或-2.9,返回的都是-2;
(3) Round()函数,才是我们需要的四舍五入的函数,因为它会返回离自变量最近的整数,这个返回的整数可能大于也可能小于原来的数,但是一定是离它最近的那个整数。

注:floor(), ceil()函数都包含在头文件“Math.h”中,但是round()函数未包含在该头文件中。因此可以通过以上的原理,来自己实现round()函数,实现含有小数的数字的四舍五入。

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
	double k=-5.9999;//5.999
	cout<<int(k*1000)<<endl;
	cout<<floor(k*1000)<<endl;
	printf("%.0lf
",k*1000);
	return 0;
}

 C/C++中使用int强制类型转换和floor函数有区别吗?

1、int是向0取整,比如:1.9会变成1,-1.9会变成-1
floor是向下取整,比如:1.8会变成1,-1.1会变成-2(注意这点和int不同)

2、返回值类型也有区别。以下是floor的原型:
float floor( float arg );
double floor( double arg );
long double floor( long double arg );
double floor( Integral arg ); (C++11

由此可见,floor返回的值是浮点型,而(int)返回的值是整型。

floor 返回小于或者等于指定表达式的最大整数 而int只返回整数部分 例如:假设a=3.2 用floor和int都是3,但是当a=-3.2的时候floor(a)返回的是-4,而(int)(a)返回的是-3;

原文地址:https://www.cnblogs.com/ssfzmfy/p/10921795.html