二分例题(D.负重越野,I.路径规划)

2024-05-27 22:52

本文主要是介绍二分例题(D.负重越野,I.路径规划),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这两天的训练赛都有一道二分的题,但是都没往二分上面想,同样不知道怎么二分。

D. Fast and Fat

思路

二分的关键也就是check函数怎么写了,求队伍最大速度,可以分为速度>=mid和<mid两部分,再判断,能不能实现速度大的背小的,并且速度>=mid.

代码

#include<bits/stdc++.h>
using namespace std;
# define int long long
int n;
struct pi{int v,w;
}a[100005];
bool cmp1(pi a,pi b)
{return a.v+a.w>b.v+b.w;
}
bool cmp2(pi a,pi b)
{return a.w>b.w;
}
int check(int x)
{vector<pi> s;//存放速度小的,需要被背着vector<pi> q;//存速度大的,for(int i=1;i<=n;i++){if(a[i].v>=x)q.push_back(a[i]);else s.push_back(a[i]);}if(q.size()<s.size())return 0;sort(q.begin(),q.end(),cmp1);//速度可能会变为vi+wi-wj,所以按vi+wi的大小顺序排sort(s.begin(),s.end(),cmp2);//w从大到小排。//无需考虑太多,如果最大的vi+wi去背wj,速度达不到,那也不用考虑其他的了,必须要保证每个小的都被背for(int i=0;i<s.size();i++){if(q[i].v+q[i].w-s[i].w<x)return 0;}return 1;
}
void solve()
{cin>>n;for(int i=1;i<=n;i++)cin>>a[i].v>>a[i].w;int l=-1,r=1e9+10;while(l<r)//这是小于等于最大值的二分{int mid=(l+r+1)>>1;if(check(mid))l=mid;else   r=mid-1;	}cout<<l<<'\n';
}
signed main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie();int t;cin>>t;while(t--){solve();}
}

I. Path Planning

思路

用一个map,键存位置,值存数字,关于check函数,我一直想的都是i,j,i+j…但这些其实可以不考虑,要满足向右下走,用两重循环,i的值在不断增大,此时已经是向下,这时只需要,设个变量判断j,就可以了

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
map<pair<int,int>,int> ma;
int n,m;
int check(int x)//这样判断很巧妙,而且首尾数字是什么,都无关紧要
{int k=0;for(int i=1;i<= n;i++)for(int j=1;j<= m;j++)//如果是一行或一列,不需要特殊考虑,因为j逐步增大{if(ma[{i,j}]<x){if(j<k) return 0;k=j;}}return 1;
}
void solve()
{cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>ma[{i,j}];//这里将map和pair结合,赛时也没想到int l=0,r=n*m;while(l<r){int mid=l+r+1>>1;if(check(mid))l=mid;else 	r=mid-1;	}cout<<l<<'\n';
}
signed main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t;cin>>t;while(t--){solve();}
}

这篇关于二分例题(D.负重越野,I.路径规划)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1008827

相关文章

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表