Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 77090 | Accepted: 15630 |
Description
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
Output
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
#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;