D. River Locks #802 div2

本文探讨了一道关于水坝填充的算法问题,通过分析得出利用二分搜索来确定最少数量的水管以在限定时间内填满所有水坝。作者强调理解题意和算法选择的重要性,指出在面对类似问题时,可以尝试将复杂情况简化,并运用已知的算法如二分查找来解决问题。
摘要由CSDN通过智能技术生成

Problem - D - Codeforces

题意是给你n个水坝和各自的容积,每个水坝上面都有一根水管可以放水,然后一秒钟放一升,问至少开多少个水管使得把n个水坝都装满的时间不得超过每次询问,一个i水坝装满之后,水可以流到i+1的水坝里面(不管高度)

做题一边读题一边想着有没有什么算法,时间长了之后就会知道什么题该用什么样的方法,不要什么题一上来就直接分析数据啥的,想一想学过的算法

这个题我一直沉浸在管子里的水是可以流的,然后不知道怎么办了,管他呢,流到哪跟我有什么关系吗,最后的题目是说流满需要多少个管子,那就看成一个整体啵,都是固定的。

假设全部管子都开着,这是所需要的最小时间了,容积是固定的,管子是固定的,相除就是最小时间了,假设某个询问小于这个数字,那直接输出-1

然后那具体开哪些个管子,在哪个上面开,管他呢,想那么多干啥啊,反正都是固定的,都是能流通的,只要关系式符合,那水怎么流,管子怎么放置就不需要关注了,因为每个管子的流速都是一样的,乘以时间,可以知道一共流了多少水,那就是二分呐,二分水管的数量,如果mid*x(x是时间,询问的时间)>=s[n],那就是合法的。

判定二分边界:二分的是水管的数量,越往右边去,越是合法的:如果check函数合法,我想找到那个合法与不合法的边界,越往右边越合法,所以所需要的答案应该在左边,因此需要改变右边界,r=mid;l=mid+1;

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=2e5+10;
ll a[N];
int n;
bool check(ll mid,ll x)
{
	return mid*x>=a[n];
} 
int main(){
	cin>>n;
	ll maxn=-1;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		a[i]+=a[i-1];
		maxn=max(maxn,(ll)ceil(a[i]*1.0/i));
	}
//	cout<<maxn<<endl;
	int Q;
	cin>>Q;
	while(Q--)
	{
		int x;
		cin>>x;
		if(x<maxn)
		{
			cout<<"-1"<<"\n";
			continue;
		} 
		ll l=1,r=n;
		while(l<r)
		{
			ll mid=l+r>>1;
			if(check(mid,x)) r=mid;
			else l=mid+1;
		}
		cout<<l<<"\n";
	}
	return 0;
}

多总结吧

二分:有二分查找,二分答案,在写题时我需要一个什么样的东西,并且序列是单调的,就可以试试二分。这个题我就是想知道有多少个水管,水管的数量也是从1到n,单调的。就可以想到二分了呀,用二分判断合不合法,找到那个最值(最值问题就可以想想二分,毕竟在边界上面,最大的最小值,最小的最大值),这个题就是要找最小需要的水管,就用了二分

很抱歉,由于你的代码没有完整的内容,我无法进行修改。但是,我可以给你提供一个大致的思路。 首先,你需要使用一个 WebSocket 客户端库来建立 WebSocket 连接。这里推荐使用 Boost.Beast 库,它是 Boost 官方提供的一个网络库,支持 WebSocket 协议。 接着,在连接成功后,你需要订阅感知话题并编写回调函数 `perceptionCallback`。在回调函数中,你可以将数据序列化为字符串,并发送到服务器。 下面是大致的代码示例: ```cpp #include "ros/ros.h" #include "std_msgs/String.h" #include <boost/thread/locks.hpp> #include <boost/beast/core.hpp> #include <boost/beast/websocket.hpp> #include <iostream> #include <string> namespace beast = boost::beast; // from <boost/beast.hpp> namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp> using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp> websocket::stream<tcp::socket> ws(io_context); void perceptionCallback(const std_msgs::String::ConstPtr& msg) { // 序列化数据为字符串 std::string serialized_data = /* TODO: 序列化数据 */; // 发送数据 ws.write(boost::asio::buffer(serialized_data)); } int main(int argc, char **argv) { ros::init(argc, argv, "websocket_client"); // 建立 WebSocket 连接 tcp::resolver resolver(io_context); auto const results = resolver.resolve("autopilot-test.t3go.cn", "443"); ws.next_layer().connect(results); ws.handshake("autopilot-test.t3go.cn", "/api/v1/vehicle/push/message/LFB1FV696M2L43840"); // 订阅感知话题 ros::NodeHandle nh; ros::Subscriber sub = nh.subscribe("perception_topic", 1000, perceptionCallback); // 运行 ROS 循环 ros::spin(); return 0; } ``` 需要注意的是,这只是一个大致的代码示例,具体实现还需要根据你的需求进行调整。另外,要确保你的程序可以访问 `autopilot-test.t3go.cn` 这个服务器,并且能够通过 WebSocket 协议进行通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值