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
题意
给出一系列数据Xi,Yi,Zi表示序列Xi,Xi+Zi,⋯,Xi+K×Zi,⋯((Xi+Ki×Zi)≤Yi),问这些序列中出现奇数次的数是哪个(只有一个数出现奇数个)?出现了多少次?
思路
注意输入格式,用至少一个空行来分隔每组数据。
有一个数是出现了奇数个,那么设C(x)表示答案是不是<=x(即x过大),具体判断方法是,若<=x的个数有奇数个,那么答案是<=x的,二分搜索即可。
#include <iostream>
#include <cstdio>
#include <sstream>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <limits>
using namespace std;
typedef long long ll;
struct ref {
ll A, B, C;
ref(ll A, ll B, ll C) : A(A), B(B), C(C) {}
};
vector<ref> refs;
bool C(ll x) { // 判断答案是否<=x,即<=x的个数应该为奇数个。
ll left = 0;
for (int i = 0; i < refs.size(); ++i) {
if (x <= refs[i].B) {
if (x >= refs[i].A) left += (x - refs[i].A) / refs[i].C + 1;
}
else left += (refs[i].B - refs[i].A) / refs[i].C + 1;
}
return left & 1;
}
void solve() {
ll lb = 0, ub = numeric_limits<ll>::max();
while (ub - lb > 1) {
ll mid = (ub + lb) >> 1;
if (C(mid)) ub = mid; // (lb, ub]
else lb = mid;
}
int cnt = 0;
for (int i = 0; i < refs.size(); ++i)
if (ub <= refs[i].B && ub >= refs[i].A)
if ((ub - refs[i].A) % refs[i].C == 0) ++cnt;
ub == numeric_limits<ll>::max() ? puts("no corruption") : printf("%lld %d\n", ub, cnt);
}
int main() {
ll A, B, C;
char line[100];
while (gets(line)) {
if (line[0] == 0) {
if (refs.size()) solve();
refs.clear();
}
else {
sscanf(line, "%lld%lld%lld", &A, &B, &C);
refs.push_back(ref(A, B, C));
}
}
if (refs.size()) solve();
return 0;
}
POJ 3061
题意
给定长度为n的数列a0,a1,⋯,an−1及整数S,求出总和不小于S的连续子序列的长度的最小值。若不存在输出0。
思路
利用前缀和s[k]=num[0]+num[1]+...+num[k],可知s[i]是单调不减的。然后二分搜索sum[j]≥sum[i]+S即可得最小的j,然后枚举求出最小的j−i。
#include <iostream>
#include <cstdio>
#include <limits>
#include <algorithm>
using namespace std;
int N, S;
int num[100005];
int sum[100005]; // sum[s]=num[0]+num[1]+...+num[s]
void solve() {
int ans = numeric_limits<int>::max();
for (int i = 0; i<N; ++i) {
// printf("i=%d, j=%ld\n", i, lower_bound(sum+i, sum+N, sum[i]+S)-sum);
// int j = lower_bound(sum+i, sum+N, sum[i]+S) - sum; // 求出最小的j
int lb = -1, ub = N; // [0, ub)
while (ub - lb > 1) {
int mid = (ub + lb) >> 1;
if (sum[mid] >= sum[i] + S) ub = mid; // (lb, ub]
else lb = mid;
}
// printf("j=%d, ub=%d\n", j , ub);
if (ub < N && ub > i) ans = min<int>(ans, ub - i); // 枚举求出最小的j-i
}
printf("%d\n", ans == numeric_limits<int>::max() ? 0 : ans);
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%d%d", &N, &S);
sum[0] = 0;
for (int i = 0; i < N; ++i) {
scanf("%d", num + i);
sum[i] = sum[i - 1 >= 0 ? i - 1 : 0] + num[i];
}
solve();
}
return 0;
}
POJ 1064 1759 3484 3061 (二分搜索)的更多相关文章
- 二分搜索 POJ 1064 Cable master
题目传送门 /* 题意:n条绳子问切割k条长度相等的最长长度 二分搜索:搜索长度,判断能否有k条长度相等的绳子 */ #include <cstdio> #include <algo ...
- POJ 1064 Cable master(二分查找+精度)(神坑题)
POJ 1064 Cable master 一开始把 int C(double x) 里面写成了 int C(int x) ,莫名奇妙竟然过了样例,交了以后直接就wa. 后来发现又把二分查找的判断条 ...
- poj 1064 Cable master 判断一个解是否可行 浮点数二分
poj 1064 Cable master 判断一个解是否可行 浮点数二分 题目链接: http://poj.org/problem?id=1064 思路: 二分答案,floor函数防止四舍五入 代码 ...
- poj 1759 Garland (二分搜索之其他)
Description The New Year garland consists of N lamps attached to a common wire that hangs down on th ...
- POJ 1064 (二分)
题目链接: http://poj.org/problem?id=1064 题目大意:一堆棍子可以截取,问要求最后给出K根等长棍子,求每根棍子的最大长度.保留2位小数.如果小于0.01,则输出0.00 ...
- poj 1064 (二分+控制精度) && hdu 1551
链接:http://poj.org/problem?id=1064 Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- POJ 1064 Cable master (二分答案)
题目链接:http://poj.org/problem?id=1064 有n条绳子,长度分别是Li.问你要是从中切出m条长度相同的绳子,问你这m条绳子每条最长是多少. 二分答案,尤其注意精度问题.我觉 ...
- [POJ] 1064 Cable master (二分查找)
题目地址:http://poj.org/problem?id=1064 有N条绳子,它们的长度分别为Ai,如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长能有多长. 二分绳子长度,然后验证即可 ...
- POJ 1064 Cable master 浮点数二分
http://poj.org/problem?id=1064 题目大意: 有N条绳子,他们的长度分别为Li,如果从它们中切割出k条长度相同的绳子的话,这K条绳子每条能有多长? 思路: 二分,设答案为m ...
随机推荐
- 浅析 Bigtable 和 LevelDB 的实现
在 2006 年的 OSDI 上,Google 发布了名为 Bigtable: A Distributed Storage System for Structured Data 的论文,其中描述了一个 ...
- Java编程思想 学习笔记8
八.多态 在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征. 多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来. “封装”通过合并特征和行为来创建新的数据类型.“实现 ...
- C# 实现立体图形变换(vs2008)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- luogu 1314 欧拉回路
欧拉路径:一笔画的路径 欧拉回路:一笔画的回路 两者判断方法一样但是输出略有不同.并且还有Fleury(弗罗莱)算法,但是我不会.. 这里就用dfs就好 判断条件: 1)图的连通性(可用并查集判断) ...
- c/s 给 服务器上传文件(c/s和b/s互传文件)
//c/s 代码 private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = ne ...
- Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlCoreTLV
今天在使用JSP,引入<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> ...
- 论文笔记系列-Simple And Efficient Architecture Search For Neural Networks
摘要 本文提出了一种新方法,可以基于简单的爬山过程自动搜索性能良好的CNN架构,该算法运算符应用网络态射,然后通过余弦退火进行短期优化运行. 令人惊讶的是,这种简单的方法产生了有竞争力的结果,尽管只需 ...
- 电脑kail linux 连接手机Nethunter,手机和电脑互传文件
1.开启nethunter的ssh 修改/etc/ssh/sshd_config 参考:解决kali linux 开启ssh服务后连接不上的问题 2.如果在手机终端修改不了(我的就是怎么也改不了),可 ...
- NSIS程序安装包制作
nsis下载地址:http://www.pc6.com/softview/SoftView_14342.html nsis使用: 启动NSIS程序主界面,选择"可视化脚本编辑器(VNISEd ...
- 【C++】解决vs2015经常卡顿的办法
VS2015经常性的卡顿,参考了zhihu里问答的办法,编译和使用的时候的确快多了 为什么vs2015经常卡顿? https://www.zhihu.com/question/34911426 感谢z ...