HDU - 7308 Operation Hope( 2023“钉耙编程”中国大学生算法设计超级联赛第三场 I)

题目

Little Q \text{Little Q} Little Q is playing an RPG \text{RPG} RPG online game. In this game, there are n n n characters labeled by 1 , 2 , … , n 1,2,…,n 1,2,,n. The i-th character has three types of quotas:

  • a i a_i ai - The maximum points of damage he can achieve in 15 15 15 seconds.
  • b i b_i bi - The maximum points of damage he can achieve in 40 40 40 seconds.
  • c i c_i ci - The maximum points of damage he can achieve in 120 120 120 seconds.

You are the team leader working for the new balance between these n n n characters, aiming at bringing hope to the weak characters. For each character, your teammates have made a plan to strengthen some skills such that the three quotas may be increased as a result. Note that it is not allowed to weaken characters, because it will make their owners upset.

To make a perfect balance, you need to accept some plans and deny others such that the gap between all the n n n characters is minimized. Note that a plan can only be entirely accepted or entirely denied. Here, the gap is defined as:

max ⁡ ( max ⁡ 1 ≤ i ≤ n a i − min ⁡ 1 ≤ i ≤ n a i , max ⁡ 1 ≤ i ≤ n b i − min ⁡ 1 ≤ i ≤ n b , max ⁡ 1 ≤ i ≤ n c i − min ⁡ 1 ≤ i ≤ n c i ) \max (\max\limits_{1\leq i\leq n}a_i-\min\limits_{1\leq i\leq n} a_i,\max\limits_{1\leq i\leq n}b_i-\min\limits_{1\leq i\leq n} b,\max\limits_{1\leq i\leq n}c_i-\min\limits_{1\leq i\leq n} c_i) max(1inmaxai1inminai,1inmaxbi1inminb,1inmaxci1inminci)

题目大意

Q \text{Q} Q 正在玩一款 RPG \text{RPG} RPG(开放世界游戏)。

在这个游戏中,有 n n n 个角色被标记为 1 , 2 , ⋯ , n 1,2,\cdots,n 1,2,,n。第 i i i 个角色有三种配额类型:

  • a i a_i ai -他在15秒内所能达到的最大伤害。

  • b i b i bi -他在40秒内所能达到的最大伤害。

  • c i c i ci -他在120秒内所能达到的最大伤害。

你是(万恶)善良的策划,为这 n n n 个角色之间的新平衡而努力,旨在为弱势角色带来希望。对于每个角色,你的队友已经制定了一个计划来加强一些技能,这样三个配额可能会因此而增加。

注意,它不允许削弱角色,因为它会使他们的主人心烦意乱。

为了达到完美的平衡,你需要接受一些计划并拒绝其他计划,这样所有 n n n 个角色之间的差距就会最小化。

请注意,计划只能被完全接受或完全拒绝。

这里,差距定义为

max ⁡ ( max ⁡ 1 ≤ i ≤ n a i − min ⁡ 1 ≤ i ≤ n a i , max ⁡ 1 ≤ i ≤ n b i − min ⁡ 1 ≤ i ≤ n b , max ⁡ 1 ≤ i ≤ n c i − min ⁡ 1 ≤ i ≤ n c i ) \max (\max\limits_{1\leq i\leq n}a_i-\min\limits_{1\leq i\leq n} a_i,\max\limits_{1\leq i\leq n}b_i-\min\limits_{1\leq i\leq n} b,\max\limits_{1\leq i\leq n}c_i-\min\limits_{1\leq i\leq n} c_i) max(1inmaxai1inminai,1inmaxbi1inminb,1inmaxci1inminci)

思路

一眼 2-SAT \text{2-SAT} 2-SAT。(很明显,我不会)

难点在建图,我们发现对于这道题不是很好建图,于是我们曲线救国。

我们可以先二分答案,然后在判断二分的答案能否满足。

这时候我们建边就可以按如下方法建边:

  • 对于两个角色,枚举他们选的方案。
  • 如果他们选的方案会使得答案大于二分的值,则连边。( 2 − S A T 2-SAT 2SAT 的边,即一个方案和另一个枚举的方案的反方案)

然后就是一个 2 − S A T 2-SAT 2SAT 版题了。

代码

#include <bits/stdc++.h>
using namespace std;
int T, n, a[200005][5], ans, k, mid, cnt, tot, vis[200005], q[200005], f[200005];
struct node {int id[200005], h, t, d;int get(int val) {if (h <= t)if (a[id[h]][d] < val - mid) {h++;return id[h - 1];}if (h <= t)if (a[id[t]][d] > val + mid) {t--;return id[t + 1];}return 0;}
} A[5];
bool cmp(int x, int y) { return a[x][k] < a[y][k]; }
void dfs(int x) {if (vis[x])return;vis[x] = 1;for (int i = 1; i <= 3; i++)while (1) {int to = A[i].get(a[x][i]);if (!to)break;dfs(to <= n ? to + n : to - n);}q[++tot] = x;
}
void ddfs(int x) {if (!vis[x])return;vis[x] = 0, f[x] = cnt;for (int i = 1; i <= 3; i++)while (1) {int to = A[i].get(a[x <= n ? x + n : x - n][i]);if (!to)break;ddfs(to);}
}
bool check() {cnt = tot = 0;for (int i = 1; i <= n * 2; i++) vis[i] = 0;for (int i = 1; i <= 3; i++) A[i].h = 1, A[i].t = n * 2;for (int i = 1; i <= n * 2; i++)if (!vis[i])dfs(i);for (int i = 1; i <= 3; i++) A[i].h = 1, A[i].t = n * 2;for (int i = tot; i; i--)if (vis[q[i]])cnt++, ddfs(q[i]);for (int i = 1; i <= n; i++)if (f[i] == f[i + n])return 0;return 1;
}
int main() {scanf("%d", &T);while (T--) {scanf("%d", &n);for (int i = 1; i <= n; i++)scanf("%d%d%d%d%d%d", &a[i][1], &a[i][2], &a[i][3], &a[i + n][1], &a[i + n][2], &a[i + n][3]);int minn = 1e9, maxn = -1e9;for (int i = 1; i <= n * 2; i++)for (int j = 1; j <= 3; j++) maxn = max(maxn, a[i][j]), minn = min(minn, a[i][j]);for (k = 1; k <= 3; k++) {for (int i = 1; i <= n * 2; i++) A[k].id[i] = i;A[k].h = 1, A[k].t = n * 2, A[k].d = k;sort(A[k].id + 1, A[k].id + n * 2 + 1, cmp);}int l = 0, r = maxn - minn;while (l <= r) {mid = (l + r) / 2;if (check())ans = mid, r = mid - 1;elsel = mid + 1;}printf("%d\n", ans);}return 0;
}

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

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

相关文章

gin框架内容(二)

上一篇过于gin的内容 https://mp.csdn.net/mp_blog/creation/editor/131953861 CSDNhttps://mp.csdn.net/mp_blog/creation/editor/131953861 一、路由组 为了管理具有相同前缀的URL, 将拥有URL共同前缀的路由划分为一组 为了代码的阅读性&#xff0c;使用{}包裹相同组的路由…

WPF icon的设置

想给控件设置个圆形图片&#xff0c;代码如下&#xff1a; ​<Setter Property"Icon"><Setter.Value><Image Source"/WpfApp1;component/Resource/1.ico" Width"16" Height"16"/></Setter.Value></Setter&…

ncnn-android-yolov7跑自己模型的注意事项

ncnn-android-yolov7 这是一个示例 ncnn android 项目&#xff0c;它依赖于 ncnn 库和 opencv https://github.com/Tencent/ncnn https://github.com/nihui/opencv-mobile https://github.com/xiang-wuu/ncnn-android-yolov7 如何构建和运行 步骤1 https://github.com/Ten…

LeetCode 0771. 宝石与石头

【LetMeFly】771.宝石与石头 力扣题目链接&#xff1a;https://leetcode.cn/problems/jewels-and-stones/ 给你一个字符串 jewels 代表石头中宝石的类型&#xff0c;另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型&#xff0c;你想…

linux 在excel里面找内容

linux 在excel里面找内容 背景&#xff1a;在大数据行业中&#xff0c;很多数据源是excel文件&#xff0c;但是常常会出现查找excel内容找到对应的文件&#xff0c;所以制作了简单的shell脚本方便查询对应的excel文件 查看下面精简的内容即可&#xff0c;开箱即用 shell转换 …

网络知识点之-堆叠与集群(1-堆叠)

本文章收录至《网络》专栏&#xff0c;点击右上角专栏图标可访问本专栏&#xff01; 堆叠技术是在以太网交换机上扩展端口使用较多的另一类技术&#xff0c;是一种非标准化技术。各个厂商之间不支持混合堆叠&#xff0c;堆叠模式为各厂商制定&#xff0c;不支持拓扑结构。流行的…

flask自己写登录验证和角色验证

python flask程序需要用户登录也需要角色验证&#xff0c;可以采用如下方法 def is_login(func):wraps(func)def inner(*args,**kwargs):user session.get(user)if not user:return redirect(url_for(login))return func(*args,**kwargs)return innerdef roles_required(*arg…

vue项目实现数组中添加多个相同的对象

在写项目的时候&#xff0c;有时候想有一个有较大length的对象数组&#xff0c;则可以使用如下的方法&#xff1a; export default {data() {const item {date: 2016-05-02,name: 王小虎,address: 上海市普陀区金沙江路 1518 弄};return {tableData: Array(20).fill(item)}} …

将Parasoft和ChatGPT相结合会如何?

ChatGPT是2023年最热门的话题之一&#xff0c;是OpenAI训练的语言模型。它能够理解和生成自然语言文本&#xff0c;并接受过大量数据的训练&#xff0c;包括用各种编程语言编写的许多开源项目的源代码。 软件开发人员可以利用大量的知识库来协助他们的工作&#xff0c;因为它具…

「预告」飞凌嵌入式邀您相约第13届配电技术应用论坛

2023年8月3日~5日&#xff0c;第十三届配电技术应用论坛即将在浙江杭州举行&#xff0c;飞凌嵌入式受邀参加。 作为助力快速实现“双碳”目标和新型电力系统建设&#xff0c;加强“双碳”目标下的智能配电网技术研发布局的主要会议&#xff0c;第十三届配电技术应用论坛将从政…

vue 前端 邮箱、密码、手机号码等输入验证规则

最近在写前端表单验证的时候&#xff0c;发现一篇文章质量很好&#xff0c;所以写下这篇文章记录 原文章链接&#xff1a;vue 邮箱、密码、手机号码等输入验证规则 1.手机号 const checkPhone (rule, value, callback) > {const phoneReg /^1[34578]\d{9}$$/;if (!value…

力扣刷题-翻转字符串

刷题链接&#xff1a;344. 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1&#xff1a; 输入&…

【vue3】vue3接收props以及emit的用法

技术&#xff1a;vue3.2.40 UI框架&#xff1a;arco-design 2.44.7 css技术&#xff1a;less 4.1.3 实现&#xff1a;子组件接收props以及通过emit方法传值父组件 vue3使用的组合式API&#xff0c;我这里使用的是defineComponent 1.父页面调用子组件 <template><d…

FPGA开发:按键消抖

按键是FPGA开发板上的重要交互元件&#xff0c;因为按键的内部的结构设计&#xff0c;在按下和松开按键时&#xff0c;按键会无法避免地产生机械抖动&#xff0c;因此要对按键输入进行特殊处理&#xff0c;否则可能会因为机械抖动产生意外的重复触发。 按键消抖有很多方法&…

C++设计模式之模板方法、策略模式、观察者模式

面向对象设计模式是”好的面向对象设计“&#xff0c;所谓”好的面向对象设计“指的是可以满足”应对变化&#xff0c;提高复用“的设计。 现代软件设计的特征是”需求的频繁变化“。设计模式的要点是”寻求变化点&#xff0c;然后在变化点处应用设计模式&#xff0c;从而更好地…

我的2023上半年总结

Hi~C站的小伙伴们好久不见哇&#xff01;釉色终于回到C站&#xff0c;开始要输出了&#xff01;这一篇文章是我的2023上半年的总结&#xff0c;以此&#xff0c;致敬那段迷茫但又不曾被辜负的时光。 文章目录 总括——你愿意花五分钟时间读读我的文章吗学习——制定目标&#…

【Matlab】基于粒子群优化算法优化BP神经网络的时间序列预测(Excel可直接替换数据)

【Matlab】基于粒子群优化算法优化BP神经网络的时间序列预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码5.1 fun.m5.2 main.m 6.完整代码6.1 fun.m6.2 main.m 7.运行结果 1.模型原理 基于粒子群优化算法&#xff08;Pa…

nsq整体架构及各个部件作用详解

文章目录 前言 nsq的整体架构图 部件&#xff1a;nsqd 部件&#xff1a;nsqlookupd 部件&#xff1a;nsq连接库 部件&#xff1a;nsqadmin 前言 上两篇博客 centos环境搭建nsq单点_YZF_Kevin的博客-CSDN博客 linux环境搭建nsq集群_YZF_Kevin的博客-CSDN博客 我们讲了nsq是…

桥梁安全监测系统中数据采集上传用 什么?

背景 2023年7月6日凌晨时分&#xff0c;G5012恩广高速达万段230公里加80米处6号大桥部分桥面发生垮塌&#xff0c;导致造成2车受损后自燃&#xff0c;3人受轻伤。目前&#xff0c;四川省公安厅交通警察总队高速公路五支队十四大队民警已对现场进行双向管制。 作为世界第一桥梁…

Hadoop 之 Spark 配置与使用(五)

Hadoop 之 Spark 配置与使用 一.Spark 配置1.Spark 下载2.单机测试环境配置3.集群配置 二.Java 访问 Spark1.Pom 依赖2.测试代码1.计算 π 三.Spark 配置 Hadoop1.配置 Hadoop2.测试代码1.统计字符数 一.Spark 配置 环境说明环境版本AnolisAnolis OS release 8.6Jdkjava versi…