首页 > 其他分享 >P1873 [COCI 2011/2012 #5] EKO / 砍树

P1873 [COCI 2011/2012 #5] EKO / 砍树

时间:2024-02-15 17:11:57浏览次数:31  
标签:EKO 二分 P1873 int mid 枚举 答案 区间 2011

题目链接:

一、本题为什么能想到利用二分解决?

\(1.\) 有单调性

提高伐木机的高度,显然地,得到的木头会减少。

同样地,放低得到的木头会增多。

而正因为答案有单调性,所以我们可以使用二分。

\(2.\) 数据范围大

如果采用暴力枚举,时间复杂度为 \(O(n \cdot m)\) 会超时。用二分优化后时间复杂度约为 \(O(n \cdot log_2m)\) 最坏时间复杂度约为 \(3e^7\) 可以过。

二、二分答案

解题的时候往往会考虑枚举答案然后检验枚举的值是否正确。若满足单调性,则满足使用二分法的条件。把这里的枚举换成二分,就变成了「二分答案」。——OI Wiki

二分答案题的几个特征:

(1)求最大/最小值;

(2)答案离散(答案有有限种可能);

(3)容易判断答案是否正确

二分答案题的做法即是:

(1)确定答案区间;

(2)在保证答案在区间内的前提下,逐步缩小区间;

(3)当区间缩小到仅包含一个可能解时,该可能解即为答案。

这里主要要注意第(2)点,就是如何缩小区间。这是二分的精华所在,也是二分搜索程序如此难写的原因。

在本题中 \(\rm check\) 函数的作用是计算木材的总长度并判断是否满足需求。如果满足需求则查找是否有小的解(指砍树高度更高)否则向树高更低的区间查找。

下面给出 \(AC\) 代码。

#include <bits/stdc++.h>

using namespace std;
using LL = long long;

const int N = 1e6 + 5;

int a[N];

bool check(int a[], int x, int n, int m) {
	LL sum = 0;
	for (int i = 0; i < n; i++) {
		if (a[i] > x) sum += a[i] - x;
	}
	return sum >= m;
}//返回true表明:x代表的高度满足题意

int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++) scanf("%d", &a[i]);
	
	sort(a, a + n);
	
	int l = 0, r = a[n-1]-1;//在[0,最高的树高)进行枚举
	while (l < r) {
		int mid = l + r + 1 >> 1;
		if (check(a, mid, n, m)) l = mid;//满足题意则尽可能抬高锯子的高度
		else r = mid - 1;//否则说明木材量还不够,需要降低锯子的高度
	}
	printf("%d", l);
	return 0;
}

标签:EKO,二分,P1873,int,mid,枚举,答案,区间,2011
From: https://www.cnblogs.com/pangyou3s/p/18016364

相关文章

  • [NOIP2011 提高组] 聪明的质监员
    原题链接首先要读懂题目啊:[Wj>=W]其实是一种bool表达,即大于等于时取1,小于时取0,然后再进行求和。根据要求出最小值大概可以猜测要运用二分,那么我们来判断单调性,首先W在所有矿石的最大最小值之间取值,W越小Y越大,W越大Y越小(观察和推理都很容易得到),那么Y是符合单调性的,即可以运用......
  • [NOI2011] 阿狸的打字机
    把询问全部放到树上,离线dfs处理点击查看代码#include<bits/stdc++.h>usingnamespacestd;strings;intt[100005][26],tot,cnt,r[100005],fa[100005],fail[100005],dfn[100005],w[100005],sum,ans[100005];boolb[100005];vector<int>a[100005];vector<int>o[1000......
  • 题解 P6491 [COCI2010-2011#6] ABECEDA
    传送门。分析两个字符大小关系不变,并且具有传递性,我们可以联想到拓扑排序来解决。因此,我们就通过字符串的大小关系,推断出一些字符的大小关系,然后拓扑排序即可。#include<bits/stdc++.h>#include<vector>#include<string>#include<queue>//#defineintlonglongusing......
  • 题解 P6548 [COCI2010-2011#2] IGRA
    传送门。题意有\(A\),\(B\)两个人,有一个含\(n\)个字符的字符串。\(A\)始终取最右侧的字符,\(B\)可以取任意一个字符,问\(B\)所取的字符串能否胜过\(A\),以及\(B\)能取的最大字符串。分析首先,我们\(A\)肯定会选择当前的最小的字符,我们就可以先把字符按大小排序,字符相......
  • P7618 [COCI2011-2012#2] FUNKCIJA 题解
    看起来比较复杂,但实际上是一个树上dp的模型。因为每一重循环都最多有一个依赖,可以转化为树上的父子关系,于是就形成了一个森林。对于非叶子节点,设\(f_{u,i}\)表示第\(u\)循环变量的值是\(i\)时所有直接或间接依赖于它的循环变量(即以它为根的子树除开它的部分)循环次数,对非......
  • [PA2011] Prime prime power
    分析注意到本题用到了常用的一个套路:对\(b\)是否大于\(2\)分类讨论。因为\(b>2\)也就是\(b\ge3\)时\(a\le10^6\),所以考虑把\(3\times10^6\)(因为有\(k\)的存在)前的质数筛出来,暴力找到\(a^b\)加入统计答案的set(\(2^{60}>10^{18}\),因此\(b\le59\))。接下来考虑\(b......
  • [POI2011] MET-Meteors
    [POI2011]MET-Meteors题面翻译ByteotianInterstellarUnion有\(n\)个成员国。现在它发现了一颗新的星球,这颗星球的轨道被分为\(m\)份(第\(m\)份和第\(1\)份相邻),第\(i\)份上有第\(a_i\)个国家的太空站。这个星球经常会下陨石雨。BIU已经预测了接下来\(k\)场陨......
  • [POI2011] INS-Inspection
    分析看到标签里写的dp,想了想可能是换根,但我不会,怎么办呢?考虑什么时候会是\(-1\)。观察样例发现,只有行动中心为\(2\)的时候才不是\(-1\),而\(2\)恰好是树的重心,那么猜想只有重心才不是\(-1\),接下来证明它。如果一个点不是重心,那么说明至少存在其中一个子树\(T'\)大小大......
  • 洛谷 P5311 [Ynoi2011] 成都七中
    洛谷传送门转化一下题意,变成求\(x\)在只经过编号\(\in[l,r]\)的点,能走到多少种颜色。考虑建出点分树。一个结论是原树上的一个连通块,一定存在一个点,使得它在点分树上的子树完全包含这个连通块的所有点。证明考虑点分治的过程,一个连通块如果没被其中一个点剖开就一定在同一......
  • 【洛谷】P1873 [COCI 2011/2012 #5] EKO / 砍树 (二分)
    题目描述见:P1873思路比较明确qwq因为答案显然满足单调性:当x超过某个数一定是错的(收集的木材大于m),而小于x一定是对的,并且x是从0一直递增。故我们只需二分法找到x。直接看代码吧qwq精髓是check函数直接模拟题目要求ww#include<iostream>usingnamespacestd;#defineMAXN100......