POJ 1064 Cable master

题目链接: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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值