题目链接:http://poj.org/problem?id=1064
题目大意:给出N条绳子,长度分别为Li,现在要获得K条长度相同的绳子,如果切这N条绳子能获得K条绳子且要求这绳子尽量长。
这题目是一道二分的题目,离散化一下然后找我想要的长度就好了,然后挑战上面写的代码是直接用的循环100次来代替while(s<e)。以后对于浮点数的运算选择直接循环好,同样的题目有2017CCCC天梯赛大区赛L3-1的物理题,我eps开到qe-6是无法拿到全部分数的。。。不如直接循环的好。
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define eps 1e-10
const int INF = 0x3f3f3f3f;
int n, k;
double t, a[10005], sum = 0, mid;
double s, e;
bool Check(double len)
{
int cnt = 0;
for(int i = 0; i < n; i++)
cnt += (int)(a[i] / len);
if(cnt >= k)
return 1;
return 0;
}
int main()
{
cin >> n >> k;
for(int i = 0; i < n; i++)
{
scanf("%lf", &a[i]);
sum += a[i];
}
s = 0, e = sum;
for(int i = 0; i < 1000; i++)
{
mid = (s + e) / 2;
if(Check(mid))
s = mid;
else
e = mid;
}
printf("%.2f\n", (int)(e * 100) / 100.0);
return 0;
}
今天再做了一次,我想用*100的方式再进行二分,发现一直wa。后来发现c++能过,g++会wa,不知道为啥,反正我也是找到了数据,全测完发现就是一样的啊,所以才想到交一发c++试试,没想到就A了。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
long long n, k;
long long a[10005];
const long long INF = 1e15;
bool Check(long long x) {
int cnt = 0;
for (int i = 0; i < n; i++) {
cnt += a[i] / x;
}
if (cnt >= k)
return 1;
return 0;
}
int main() {
// freopen("cable.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
long long sum = 0;
double tmp;
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> tmp;
a[i] = tmp * 100 + 0.01;
sum += a[i];
}
if (sum < k)
printf("0.00\n");
else {
long long front = 0, back = INF;
while (back - front > 1) {
long long mid = (front + back) / 2;
if (Check(mid)) {
front = mid;
}
else {
back = mid;
}
}
double ans = front / 100.0;
printf("%.2lf\n", ans);
}
// system("pause");
return 0;
}