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.h>
#include<algorithm>
using namespace std;

int N, K;
double length[10000 + 5];
const double EPS = 1e-6; // EPS取得太小会死循环
bool C(double x) {
	int count = 0;
	for (int i = 0; i < N; ++i) count += int(length[i] / x);
	if (count >= K) return true;
	return false;
}
void solve() {
	double lb = 0.0, ub = 100000000.0;
	// while(ub - lb > EPS) { // 精度不好控制
	for (int i = 0; i < 100; ++i) { // 精度(1/2)^100=10e-30,lb几乎等于ub
		double mid = (lb + ub) / 2.0;
		if (C(mid)) lb = mid; // 半闭半开区间[lb, ub)
		else ub = mid;
	}
	printf("%.2f\n", floor(lb * 100) / 100); // .2f会四舍五入所以要先*100取整以截取
}
int main()
{
	scanf("%d%d", &N, &K);
	for (int i = 0; i < N; ++i) scanf("%lf", &length[i]);
	solve();
	return 0;
}

POJ 1759

题意

在New Year garland的地方需要挂灯笼,现已知最左边的灯笼高度H1=A和灯笼总数N,第i个灯笼高度满足,问最右边的灯笼HN能有多低(要求所有灯笼不着地)?

思路

后来确定第二个灯笼高度,即可确定第三个灯笼高度,以此类推,得到方程,在用个数组标记下值,二分搜索出第二个灯笼最低高度,那么最后一个灯笼高度就是答案。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int N;
double A;
double H[1005];
const double eps = 1e-6;
double h(int i, double x) { // 已知h(2) = x
	if (i == 1) return H[1] = A;
	else if (i == 2) return H[2] = x;
	else return H[i] = 2.0*H[i - 1] - H[i - 2] + 2.0;
}
bool C(double x) { // 判断第二个灯笼的高度为x,是否合适。
	for (int i = 1; i <= N; ++i)
	if (h(i, x) < eps) return false; // 一旦灯笼着地,即不符合要求
	return true;
}
void solve() {
	double lb = 0, ub = 10000.0;
	for (int i = 0; i < 100; ++i) { // 二分求出第二个灯笼到底该多低
		double mid = (ub + lb) / 2.0;
		if (C(mid)) ub = mid; // (lb, ub]
		else lb = mid;
	}
	printf("%.2f\n", H[N]); // 最后一个灯笼的高度
}
int main() {
	cin >> N >> A;
	solve();
	return 0;
}

POJ 3484

时间: 2024-10-07 18:03:54

POJ 1064 1759 3484 3061 (二分搜索)的相关文章

二分搜索 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 浮点数二分

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(二分查找+精度)(神坑题)

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 Cable master(很好玩的二分搜索)

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

POJ - 3484 Showstopper 二分搜索

题目大意:给出N个X Y Z组合,其中X Y Z组合能够输出 X, X + Z, X + 2 * Z- X + K * Z(X+K * Z <= Y)问这些输出的数中,有哪个数是输出奇数次的 解题思路:输出保证最多只有一个奇数 假设J是输出奇数次的那个数,那么小于J的所有输出的数的个数之和就为偶数,大于等于J的所有输出的数的个数之和为奇数 如果以i为标准,输出小于等于i的所有数之和,i从小到大变化的话,就会有如下的形式 偶偶偶偶偶偶奇奇奇...第一个奇刚好是J (具体的可以自己验证) 通过上面的

poj 1759 Garland (二分搜索之其他)

Description The New Year garland consists of N lamps attached to a common wire that hangs down on the ends to which outermost lamps are affixed. The wire sags under the weight of lamp in a particular way: each lamp is hanging at the height that is 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