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

Living-Dream 系列笔记 第5期

时间:2024-03-09 12:33:06浏览次数:16  
标签:二分 Living int double sum mid 笔记 Dream check

本期主要讲解二分答案的进阶。

例题

T1

二分需要的秒数,在 check 函数中对于每件衣服,若其在 \(x\) 秒内无法自然晒干,则使用烘干机,并令 \(sum\) 加上使用烘干机的秒数,最后判断 \(sum\) 是否 \(\le x\) 即可。

\(Trick\):二分边界需要按数据范围尽可能开大,不能开小了。

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

int n,a,b;
int w[500031];

bool check(int x){
    int sum=0;
    for(int i=1;i<=n;i++){
        int t=w[i]-x*a;
        if(t>0)
            sum+=ceil(t*1.0/b);
    }
    return sum<=x;
}

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

T2

基本思路与上期例题基本一致,仅需将 \(a\) 数组的每个数都 \(\times 100\) 转换为整数,最后输出 \(L \div 100\) 转换为小数。

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

int n,k;
int a[10031],maxx;

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

signed main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        double x;
        cin>>x,a[i]=x*100,maxx=max(maxx,a[i]);
    }
    
    int l=0,r=maxx+1;
    while(l+1<r){
        double mid=(l+r)>>1;
        if(check(mid)) l=mid;
        else r=mid;
    }
    cout<<setprecision(2)<<fixed<<l/100.0;
    return 0;
}

T3

这题是个将最小值最大化的二分,还是考虑二分最近距离的最大值。

check 函数中,记录一个变量 \(last\) 保存上一头牛被安放的坐标。循环 \(n\) 个牛棚,若当前牛棚的坐标 \(x_i-last \ge mid\),则令被安放的牛数 \(y \gets y+1\),同时更新 \(last \gets x_i\)。最后判断 \(y\) 是否 \(\ge c\) 即可。

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

int n,c;
int a[100031];

bool check(int x){
    int tot=0,last=-1e9;
    for(int i=1;i<=n;i++)
        if(a[i]-last>=x) tot++,last=a[i];
    return tot>=c;
}

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

习题

T1

与上一题类似,二分最短跳跃距离的最大值。

check 函数中,记录三个变量:\(sum\)、\(cur\) 和 \(nxt\),分别表示移除的石头数、当前位置和下一个位置。初始均为 \(0\)。

枚举 \(n\) 个石头,若 \(d_{nxt}-d_{cur} < mid\),则 \(sum \gets sum+1\),否则令 \(cur \gets nxt\)。

注意 \(a_{n+1}\) 应当设为 \(L\)(不是二分左端点)。

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

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

bool check(int x){
    int nxt=0,cur=0,sum=0;
    while(nxt<=n){
        nxt++;
        if(a[nxt]-a[cur]<x) sum++;
        else cur=nxt;
    }
    return sum<=m;
}

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

T2

二分可用时间,在 check 函数中计算在 \(mid\) 时间内会消耗完的充电器需要补充的电量之和,与 \(mid \times p\) 比较即可。

注意保留六位小数。

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

const double eps=1e-6; 
double n,p;
double a[100031],b[100031];

bool check(double x){
    double s=0.0;
    for(int i=1;i<=n;i++)
        if(a[i]*x>b[i]) s+=(a[i]*x-b[i]);
    return s<=x*p;
}

int main(){
    cin>>n>>p;
    double s=0.0;
    for(int i=1;i<=n;i++) 
        cin>>a[i]>>b[i],s+=b[i];
    if(s<=p){ cout<<-1.000000; return 0; }
    
    double l=0.0,r=1e10;
    while(l+eps<r){
        double mid=(l+r)/2.0;
        if(check(mid)) l=mid;
        else r=mid;
    }
    cout<<setprecision(6)<<fixed<<l;
    return 0;
}

标签:二分,Living,int,double,sum,mid,笔记,Dream,check
From: https://www.cnblogs.com/XOF-0-0/p/18062525

相关文章

  • 挑选一款适合自己的笔记本电脑的步骤
    你知道如何挑选一款适合自己的笔记本电脑吗?笔记本电脑有许多品牌和型号,因此挑选出合适的笔记本电脑是一项艰巨的任务。为了能够找到最适合你的笔记本电脑,你需要考虑一系列因素。需要先了解几个常见问题:·从什么渠道购买笔记本·笔记本电脑品牌都有哪些·购买笔记本首先弄清......
  • 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......
  • MYSQL学习笔记15: 数值函数
    数值函数ceil向上取整(并不是四舍五入)selectceil(1.5);selectceil(2.1);floor向下取整selectfloor(3.9);selectfloor(2.0);mod取模(余数)selectmod(7,4);rand0-1的随机小数,不包括0和1selectrand();round四舍五入#参数2:保留的......