POJ 1064 1759 3484 3061 (二分搜索)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于POJ 1064 1759 3484 3061 (二分搜索)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3484 Showstopper(二分答案)

poj 3484 Showstopper

POJ-3484 Showstopper---二分+前缀和

poj3061 Subsequence

POJ 3061

POJ3484 Showstopper (二分+字符串处理)