P5928 [国家集训队] 文学 题解

news2024/9/20 20:40:10

Description

给定 n n n 个半平面 a i x + b i y ≤ c i a_i x+b_i y\le c_i aix+biyci p p p 个关键点 ( x i , y i ) (x_i,y_i) (xi,yi),第 i i i 个半平面有价格 w i w_i wi,你需要选择一些半平面覆盖所有的关键点,同时使总价格最小。

求最小的总价格。

Solution

此解法为 O ( n 4 ) O(n^4) O(n4) 正解,并非随机化算法,同时码量小,最优解前三。

同时不需要对半平面做任何操作,也不需要对关键点做分类,或作出一个新的坐标系。

在纸上画一些半平面后容易发现,半平面未覆盖的区域为一个凸包或凸壳,由于凸包和凸壳没有本质区别,为方便表述,下文以凸包为例。

同时我们还发现,最优情况下所有半平面都限制凸包,如图。

因为一个半平面若不限制凸包可以直接不选,减少花费。

用一条平行于 y y y 轴的线从左到右去扫描凸包,发现不论横坐标为何值都只有两个半平面在限制凸包。

对于关键点而言,只要此时限制凸包的两个半平面能覆盖它就是合法的,否则要再添加一个半平面来覆盖它。

容易想到用动态规划来进行此操作。

d p i , j , k dp_{i,j,k} dpi,j,k 表示当前扫描线已移动到第 i i i 个关键点(关键点已按横坐标排好序),上下限制凸包的半平面标号为 j , k j,k j,k(钦定 j < k j<k j<k),此时的最小花费。

初始化将 d p dp dp 全设为 inf ⁡ \inf inf

边界为 d p 0 , j , k = w j + w k ( 0 ≤ j < k ≤ n ) dp_{0,j,k}=w_j+w_k(0\le j<k\le n) dp0,j,k=wj+wk(0j<kn)

c h e c k ( i , j ) check(i,j) check(i,j) 表示第 i i i 个点是否被第 j j j 个半平面覆盖。

依照上文操作得出转移方程:

{ d p i , j , k = min ⁡ ( d p i , j , k , d p i − 1 , j , k ) c h e c k ( i , j ) ∨ c h e c k ( i , k ) = t r u e d p i , j , l = min ⁡ ( d p i , j , l , d p i − 1 , j , k + w l ) c h e c k ( i , l ) = t r u e d p i , k , l = min ⁡ ( d p i , k , l , d p i − 1 , j , k + w l ) c h e c k ( i , l ) = t r u e \begin{cases}dp_{i,j,k}=\min(dp_{i,j,k},dp_{i-1,j,k})&check(i,j)\lor check(i,k)=true\\dp_{i,j,l}=\min(dp_{i,j,l},dp_{i-1,j,k}+w_l)&check(i,l)=true\\dp_{i,k,l}=\min(dp_{i,k,l},dp_{i-1,j,k}+w_l)&check(i,l)=true\end{cases} dpi,j,k=min(dpi,j,k,dpi1,j,k)dpi,j,l=min(dpi,j,l,dpi1,j,k+wl)dpi,k,l=min(dpi,k,l,dpi1,j,k+wl)check(i,j)check(i,k)=truecheck(i,l)=truecheck(i,l)=true

那么答案就为 min ⁡ 0 ≤ j < k ≤ n d p p , j , k \min\limits_{0\le j<k\le n}dp_{p,j,k} 0j<knmindpp,j,k

为什么此方程不会选择同一个半平面多次呢?

因为若 l l l j , k j,k j,k 前已选择且为最优方案,那么在后来的任意横坐标下, j , k j,k j,k 覆盖的范围严格优于 l l l,取最小值时会被除去,因此不会被重复计算。

记得没有满足条件的选择方案时,输出 -1

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,p;
int a[110],b[110],c[110],w[110];
int dp[110][110][110];
struct node{
	int x,y;
}t[110];
bool cmp(node x,node y){
	return x.x<y.x;
}
bool check(int x,int y){
	if(a[y]*t[x].x+b[y]*t[x].y<=c[y]) return 1;
	return 0;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>p;
	a[0]=b[0]=0,c[0]=-1e9,w[0]=0;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i]>>c[i]>>w[i];
	}
	for(int i=1;i<=p;i++){
		cin>>t[i].x>>t[i].y;
	}
	sort(t+1,t+1+p,cmp);
	for(int i=0;i<=p;i++){
		for(int j=0;j<n;j++){
			for(int k=j+1;k<=n;k++){
				dp[i][j][k]=1e9;
			}
		}
	}
	for(int i=0;i<n;i++){
		for(int j=i+1;j<=n;j++){
			dp[0][i][j]=w[i]+w[j];
		}
	}
	for(int i=1;i<=p;i++){
		for(int j=0;j<n;j++){
			for(int k=j+1;k<=n;k++){
				if(dp[i-1][j][k]==1e9) continue;
				if(check(i,j)||check(i,k)){
					dp[i][j][k]=min(dp[i][j][k],dp[i-1][j][k]);
					continue;
				}
				for(int l=1;l<=n;l++){
					if(l==j||l==k||!check(i,l)) continue;
					dp[i][min(l,j)][max(l,j)]=min(dp[i][min(l,j)][max(l,j)],dp[i-1][j][k]+w[l]);
					dp[i][min(l,k)][max(l,k)]=min(dp[i][min(l,k)][max(l,k)],dp[i-1][j][k]+w[l]);
				}
			}
		}
	}
	int ans=1e9;
	for(int i=0;i<n;i++){
		for(int j=i+1;j<=n;j++){
			ans=min(ans,dp[p][i][j]);	
		}
	}
	cout<<(ans==1e9?-1:ans);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2082407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入探索Elasticsearch:从零基础到实战精通的全方位指南

ElasticSearch 一、初识ElasticSearch1、ES的介绍2、索引3、正排索引3、倒排索引 一、安装1、下载2、检查是否启动 二、语法1、添加一个文档编辑2、批量插入3、搜索4、查询某个特定的字段5、根据id查询6、修改7、删除8、mapping 三、分词器 一、初识ElasticSearch 1、ES的介绍…

大型公司网络系统集成方案

一、前言 1.1.公司综合信息系统建设目标 -----------------------------------------------------3 1.2. 用户具体需求----------------------------------------------------------------------------4 1.3.公司综合信息系统建设原则 -------------------------------…

vue3+ts+mock实现增删改查json文件

1.代码结构图&#xff1a; 2.路由 import { createRouter, createWebHashHistory } from "vue-router";import Home from "/pages/home/index.vue"; import AppDetail from "/pages/app-detail/index.vue"; import PageDetail from "/pages…

hadoop生态圈(四)- MapReduce

目录 MapReduce的基本原理 MapReduce流程图 Map阶段执行流程 Reduce阶段执行流程 Shuffle机制 MapReduce解决的是海量数据计算 MapReduce的思想核心是“分而治之”。就是把一个复杂的问题按一定的“分解”方法分为规模较小的若干部分&#xff0c;然后逐个解决&#xff0c;…

作业0828

使用C手动封装一个顺序表&#xff0c;包含成员数组一个&#xff0c;成员变量N个 #include <iostream> #include <string>using namespace std;using datatype int;struct Seqlist { private:datatype *data NULL;int size 0;int len 0;public://初始化函数voi…

从零成本到高效能:免费报表工具在金融行业的实践与应用

在当今金融行业中&#xff0c;多样化的报表体系是支撑机构高效运营、精准决策的重要基石。这些报表不仅反映了金融机构的财务状况&#xff0c;还涵盖了风险管理、业绩评估、流动性管理及合规监管等多个维度。今天我将带领大家深入探讨金融行业中这些报表的多样性和重要性&#…

数据的存储3(第三十二天)

1.整形在内存中的存储&#xff08;补充&#xff09; 原码&#xff0c;反码&#xff0c;补码的概念 &#xff08;1&#xff09;正数的原码&#xff0c;反码&#xff0c;补码相同 &#xff08;2&#xff09;对于整数来说&#xff1a;数据存放内存中其实存放的就是补码 2.浮点…

最长的一帧学习 part3

文章目录 八、osgUtil:: SceneView::cull ()part1 初始化必要的SceneView类成员变量part2 立体显示的处理part3 执行SceneView::cullStage函数&#xff0c;它也是场景视图筛选工作的核心函数part3.1 首先统计场景中的遮挡节点&#xff08;OccluderNode&#xff09;&#xff0c;…

【python】关于判断空值None、判断len()=0,和 if not 的区别

如果我们问一个问题&#xff1a;如果一个东西是不存在的&#xff0c;那么它的长度是多少&#xff1f; 我一开始会不假思索地回答&#xff1a;都不存在了&#xff0c;长度肯定是0啦。 但是细想一下&#xff0c;它都不存在了&#xff0c;还怎么会有长度呢&#xff1f; 这就有点像…

【Java】数据类型与变量(二)

目录 3.变量 3.1什么是变量&#xff08;变量的概念&#xff09; 3.2语法格式 ​编辑​编辑3.3整型变量 3.3.1整型变量如何定义 ​编辑 3.3.2长整型变量 3.3.3短整型变量 3.3.4字节型变量 3.4浮点型变量 3.4.1双精度浮点型 3.4.2单精度浮点型 3.4.3单精度浮点型与双…

【大模型开源教程】Git开源教程「动手学大模型应用开发」,学微调也太简单了

LLM 正逐步成为信息世界的新革命力量&#xff0c;其通过强大的自然语言理解、自然语言生成能力&#xff0c;为开发者提供了新的、更强大的应用开发选择。随着国内外井喷式的 LLM API 服务开放&#xff0c;如何基于 LLM API 快速、便捷地开发具备更强能力、集成 LLM 的应用&…

AI搜索“懒人神器”,如何向谷歌和百度发起挑战?

“属于传统搜索的时代&#xff0c;已经彻底落幕了。” 2024年2月&#xff0c;全球IT分析与评估机构Gartner在一份报告中如此判断。同时该机构预测&#xff0c;到2026年&#xff0c;传统搜索引擎的搜索量将减少25&#xff05;。 与此同时&#xff0c;从最近公布的财报来看&…

源代码加密是什么?给源代码加密如何做?

一、源代码加密是什么&#xff1f; 源代码加密是一种通过特定的加密算法和工具对软件源代码文件进行保护的技术&#xff0c;使得只有授权用户才能解密和访问代码。加密技术可以防止未经授权的访问、阅读、修改或复制源代码。源代码加密&#xff0c;则是对源代码文件进行加密处…

Kubernetes高级调度2

一.Taint和Toleration 1.为什么使用taint &#xff08;1&#xff09;不让pod被部署到被设置为污点的节点上。 &#xff08;2&#xff09;不让master节点部署业务&#xff0c;只部署系统组件 &#xff08;3&#xff09;除了指点pod外&#xff0c;不想让节点部署其他pod 2.为…

解决ESP32 VScode环境报错:Something went wrong while trying to build the project。

当我在vscode开发esp32时&#xff0c;点击构建项目 报了个错。 说明&#xff1a;项目目录包含了中文字符&#xff0c;我给换成全英文路径&#xff0c;再次尝试 成功 改完发现还有问题&#xff0c;来到这个目录&#xff0c;里面的中文也要改成英文。&#xff08;不止&#xff0…

Qt是不是经常写个QWidget输入参数?

发现Qt自带的一个输入控件QInputDialog类 QInputDialog类提供了一个简单方便的对话框&#xff0c;用于从用户获取单个值。 输入值可以是字符串、数字或列表中的项。必须设置一个标签来告诉用户他们应该输入什么。 提供了五个静态方便函数:getText()、getMultiLineText()、getI…

干货:2024年四大免费PDF编辑器精选指南!

在日常生活工作中&#xff0c;我们几乎每天都会接触到PDF文档。当我们需要对这些文档进行编辑时&#xff0c;一些出色的免费PDF编辑器十分重要。接下来&#xff0c;我将分享自己使用过的几款优秀的免费PDF编辑器&#xff01; 福昕PDF编辑器&#xff1a;简洁高效的编辑体验 链…

【Python基础】学习Python常见的几种运行报错,看完之后,你就不会再犯错了!!!(附带解析)

学习Python时&#xff0c;遇到运行时错误是很常见的&#xff0c;这些错误通常是因为代码中存在语法错误、逻辑错误或是对Python的某些特性理解不够深入所导致的。 如果你也是刚入门的小伙伴呢&#xff0c;小编为你们准备了入门Python学习籽料和Python入门实践&#xff0c;点击…

期权末日轮的前提——高杠杆特性是怎样的?

今天带你了解期权末日轮的前提——高杠杆特性是怎样的&#xff1f;期权末日轮是临近期权到期行权&#xff0c;期权合约往往出现大的波动涨跌幅。 如何在实际交易过程中艺术的运用期权产品的高杠杆&#xff0c;始终是一个永无止境的话题&#xff0c;结合一些实战上的经验就是&a…

miniQMT怎么获取历史/最新行情?miniQMT原生python环境如何获取历史/最新行情?

原生Python 调用方法 python from xtquant import xtdata xtdata.get_market_data_ex(field_list[],# 字段stock_list[],# 合约代码列表period1d,# 数据周期——1m、5m、1d、tickstart_time,# 数据起始时间%Y%m%d或%Y%m%d%H%M%Send_time,# 数据结束时间%Y%m%d或%Y%m%d%H%M%Sc…