首页 > 其他分享 >Living-Dream 系列笔记 第4期

Living-Dream 系列笔记 第4期

时间:2024-03-09 12:33:24浏览次数:34  
标签:Living int max sum mid 笔记 long Dream nb

本期主要讲解二分答案。

知识点

使用场景:

  • 最小值最大化,或最大值最小化。

  • 在限制条件下找最值。

与二分查找的区别:

  • LR 均为答案,而非下标。

输出:

  • 最大化输出 L,反之输出 R

例题

T1

二分 \(M\) 的值,边界为 \(L=-1,R=\max{\{a_i\}}\)。每次枚举到一个 \(mid\) 就对于每个 \(a_i\),计算能砍下的木头是否 \(\ge m\)。

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,m,maxh,h[1000031];

bool check(int x){
    int sum=0;
    for(int i=1;i<=n;i++)
        if(h[i]>x) sum+=h[i]-x;
    return sum>=m;
}

signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>h[i],maxh=max(maxh,h[i]);
    int l=-1,r=maxh+1;
    while(l+1<r){
        int mid=(l+r)>>1;
        if(check(mid)) l=mid;
        else r=mid;
    }
    cout<<l;
    return 0;
}

T2

二分 \(l\) 的值,边界为 \(L=0,R=\max{\{a_i\}}\)(注意 \(L\) 为 \(0\),这样可以免去不必要的特判)。

每次枚举到一个 \(mid\),则当前段数为 \(\sum^{n}_{i=1} \lfloor \dfrac{a_i}{mid} \rfloor\),判断其是否 \(\ge m\) 即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,k,l[100031];

bool check(int x){
	int sum=0;
	for(int i=1;i<=n;i++) sum+=l[i]/x;
	return sum>=k;
}

signed main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>l[i];
	
	int l=0,r=1e8+1;
	while(l+1<r){
		int mid=(l+r)>>1;
		if(check(mid)) l=mid;
		else r=mid;
	}
	cout<<l;
	return 0;
}

习题

T3

首先读入字符串,分离并计算出做一个汉堡需要的 \(B,S,C\)。记读入的已有材料数分别为 \(nb,ns,nc\),需要的钱数分别为 \(mb,ms,mc\),已有钱数为 \(money\)。

二分能做出的汉堡个数,边界为 \(L=-1,R=money+\max{(nb,ns,nc)}\)。对于每个 \(mid\),计算出除去已有材料后还需要花的钱,与 \(money\) 作比较即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;

string str;
int b,s,c;
int nb,ns,nc;
int mb,ms,mc;
int money;

bool check(int x){
	int sum=0;
	if(x*b>nb) sum+=(x*b-nb)*mb;
	if(x*s>ns) sum+=(x*s-ns)*ms;
	if(x*c>nc) sum+=(x*c-nc)*mc;
	return sum<=money;
}

signed main(){
	cin>>str;
	cin>>nb>>ns>>nc;
	cin>>mb>>ms>>mc;
	cin>>money;
	
	for(int i=0;str[i];i++){
		if(str[i]=='B') b++;
		else if(str[i]=='S') s++;
		else c++;
	}
	
	int l=-1,r=money+max(nb,max(ns,nc))+1;
	while(l+1<r){
		int mid=(l+r)>>1;
		if(check(mid)) l=mid;
		else r=mid; 
	}
	cout<<l;
	return 0;
} 

T4

记需要 \(x\) 轮才能满足所有人的要求,且所有人共需要玩 \(s\) 轮游戏。

由定义可知 \(s=\sum^{n}_{i=1} a_i\),并且由题意有 \((n-1)x \ge s\)。

则可以二分 \(x\) 的值,边界为 \(L=\max{\{a_i\}}-1,R=s+1\)。

每次枚举到一个 \(mid\),就按照上式检查即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,s,m,a[100031];

signed main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i],s+=a[i],m=max(m,a[i]);
    int l=m-1,r=s+1;
    while(l+1<r){
        int mid=(l+r)>>1;
        if(mid*(n-1)>=s) r=mid;
        else l=mid;
    }
    cout<<r;
    return 0;
}

标签:Living,int,max,sum,mid,笔记,long,Dream,nb
From: https://www.cnblogs.com/XOF-0-0/p/18062526

相关文章

  • Living-Dream 系列笔记 第5期
    本期主要讲解二分答案的进阶。例题T1二分需要的秒数,在check函数中对于每件衣服,若其在\(x\)秒内无法自然晒干,则使用烘干机,并令\(sum\)加上使用烘干机的秒数,最后判断\(sum\)是否\(\lex\)即可。\(Trick\):二分边界需要按数据范围尽可能开大,不能开小了。#include<bits/......
  • 挑选一款适合自己的笔记本电脑的步骤
    你知道如何挑选一款适合自己的笔记本电脑吗?笔记本电脑有许多品牌和型号,因此挑选出合适的笔记本电脑是一项艰巨的任务。为了能够找到最适合你的笔记本电脑,你需要考虑一系列因素。需要先了解几个常见问题:·从什么渠道购买笔记本·笔记本电脑品牌都有哪些·购买笔记本首先弄清......
  • 3/9 训练笔记
    P5268[SNOI2017]一个简单的询问题解不妨把每个区间表示成\(|V|\)维向量\(b\)的形式,其中\(b[i]\)为在区间\([l,r]\)中,\(i\)出现的次数。然后我们发现要求的实际上是\(a\cdotb\)。拆一下(这里用\(g(i)\)表示\([1,i]\)的向量):\(a\cdotb=[l_1,r_1]\cdot[l_......
  • 课堂笔记2
    define_CRT_SECURE_NO_WARNINGSinclude<stdio.h>//////冒泡排序该方法只能进行整数的排序//voidBubbleSort(intarr[],intsz)//{//inti=0;//intj=0;//for(i=0;i<sz-1;i++)//{//for(j=0;j<sz-1-i;j++)......
  • 王道计算机网络截图笔记
    目录第一章概述1.计算机网络概览1.1网络与计算机网络1.2计算机网络的功能1.3计算机网络的组成1.3.1组成部分1.3.2工作方式1.3.3功能组成1.4计算机网络的分类1.5小结2.计算机网络的标准化工作2.1标准的分类2.2RFC2.3标准化工作的相关组织2.4小结3.计算机网络性能指标3......
  • 2024.3.9 笔记
    2024.3.9笔记P1948题目大意为在无向图上求出从\(1\)到\(N\)的路径,使路径上第\(k+1\)大的边权尽量少。第一种是DP用\(f[i][j]\)表示从\(1\)到点\(i\),用了\(j\)条免费线的最小花费。对于一条\(u->v\)的边\(e\)有转移:不用免费线\(f_{v,k}=min(f_{v,k},max......
  • MYSQl学习笔记19: 外键约束
    外键约束用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性具有外键的表(emp)称为子表外键关联的表(dept)称为父表外键约束创建表时添加createtable表名(字段名数据类型,[constrain][外键名称]foreignkey(外键字段名)references主表(主表......
  • MYSQL学习笔记20: 外键约束(删除/更新行为)
    外键约束删除/更新行为setdefault在mysql的默认引擎innodb中不支持CASCADEaltertable表名addconstraint外键名称foreignkey(外键字段)references主表名(主表字段名)onupdatecascadeondeletecascade;建立外键约束#如果父表和子表建立外键的字段有不同的......
  • MYSQL学习笔记17: 流程控制函数(IF, CASE)
    流程控制函数(IF,CASE)ifselectif(true,'ok','error');selectif(false,'ok','error');/*相当于iftrue:ok;else:error;*/ifnullselectifnull('ok','default');selectifnull(......
  • MYSQL学习笔记18: 约束
    约束约束是作用于表中字段上的规则,用于限制存储在表中的数据.保证表中的正确性,有效性和完整性约束作用于表中字段上,可以在建表和修改表时为表添加约束按照需求创建表,并创建约束createtableusers(idintprimarykeyauto_incrementcomment'主键',n......