【基础排序】CF - 赌场游戏Playing in a Casino

题目描述

在整个太阳系都很有名的赌场 Galaxy Luck 推出了一种新的纸牌游戏。

在这个游戏中,有一副由 nnn 张牌组成的牌堆。每张牌上写有 mmm 个整数。nnn 位玩家各自从牌堆中获得一张牌。

然后所有玩家两两对局,每一对玩家恰好对局一次。
例如,如果总共有 444 位玩家,那么会进行 666 场对局:

  • 111 位对第 222
  • 111 位对第 333
  • 111 位对第 444
  • 222 位对第 333
  • 222 位对第 444
  • 333 位对第 444

每一场对局都会产生一位获胜者,获胜者将从奖池中获得一定数量的筹码。
假设第一个玩家的牌为 a1,a2,…,ama_1,a_2,\dots,a_ma1,a2,,am,第二个玩家的牌为 b1,b2,…,bmb_1,b_2,\dots,b_mb1,b2,,bm
那么获胜者获得的筹码数量为:

∣a1−b1∣+∣a2−b2∣+⋯+∣am−bm∣|a_1 - b_1| + |a_2 - b_2| + \dots + |a_m - b_m| a1b1+a2b2++ambm

其中 ∣x∣|x|x 表示 xxx 的绝对值。

为了确定奖池的大小,我们需要计算所有对局中获胜者总共获得的筹码数。 由于牌的数量和玩家数可能非常大,现在请你编写一个程序完成这个计算。

输入格式

输入包含多组测试数据。

第一行输入一个整数 ttt (1≤t≤1000)(1 \leq t \leq 1000)(1t1000),表示测试数据的组数。

对于每组测试数据:

  • 第一行包含两个整数 n,mn, mn,m (1≤n⋅m≤3×105)(1 \leq n \cdot m \leq 3 \times 10^5)(1nm3×105),分别表示牌的数量和每张牌上的数字个数。
  • 接下来 nnn 行,每行包含 mmm 个整数 ci,jc_{i, j}ci,j (1≤ci,j≤106)(1 \leq c_{i,j} \leq 10^6)(1ci,j106),表示第 iii 张牌上的数字。

保证所有测试数据中 n⋅mn \cdot mnm 的总和不超过 3×1053 \times 10^53×105

输出格式

对于每组测试数据,输出一个整数,表示所有对局中获胜者获得的筹码总数。

样例输入

3
3 5
1 4 2 8 5
7 9 2 1 4
3 8 5 3 1
1 4
4 15 1 10
4 3
1 2 3
3 2 1
1 2 1
4 2 7

样例输出

50
0
31

说明/提示

样例 1

三张牌:

  • 玩家 1:[1,4,2,8,5][1,4,2,8,5][1,4,2,8,5]

  • 玩家 2:[7,9,2,1,4][7,9,2,1,4][7,9,2,1,4]

  • 玩家 3:[3,8,5,3,1][3,8,5,3,1][3,8,5,3,1]

  • 玩家 1 对 玩家 2: ∣1−7∣+∣4−9∣+∣2−2∣+∣8−1∣+∣5−4∣=19|1-7|+|4-9|+|2-2|+|8-1|+|5-4|=19∣17∣+∣49∣+∣22∣+∣81∣+∣54∣=19

  • 玩家 1 对 玩家 3: ∣1−3∣+∣4−8∣+∣2−5∣+∣8−3∣+∣5−1∣=18|1-3|+|4-8|+|2-5|+|8-3|+|5-1|=18∣13∣+∣48∣+∣25∣+∣83∣+∣51∣=18

  • 玩家 2 对 玩家 3: ∣7−3∣+∣9−8∣+∣2−5∣+∣1−3∣+∣4−1∣=13|7-3|+|9-8|+|2-5|+|1-3|+|4-1|=13∣73∣+∣98∣+∣25∣+∣13∣+∣41∣=13

总和为 19+18+13=5019+18+13=5019+18+13=50

提交链接

Playing in a Casino

思路分析

题目大意

在赌场里有一个游戏:

  • 一共有 nnn 张牌,每张牌上写有 mmm 个整数。
  • 我们关心的“代价”是:对每一列数字,计算所有数对的差的绝对值之和
  • 最终答案就是所有列的代价总和。

换句话说,如果我们固定一列,里面有数字 {x1,x2,…,xn}\{x_1, x_2, \dots, x_n\}{x1,x2,,xn}
那么这一列的贡献是:

∑1≤i<j≤n∣xi−xj∣\sum_{1 \leq i < j \leq n} |x_i - x_j| 1i<jnxixj

我们要求所有列的贡献总和。

🔎 思路分析

1. 为什么不能直接暴力

  • 每列有 nnn 个数,暴力计算所有数对差值需要 O(n2)O(n^2)O(n2)
  • nnn 可能很大(比如 2×1052 \times 10^52×105),直接计算会超时。

所以必须找到一个更快的公式。

2. 关键观察

考虑一列的数字: {x1,x2,…,xn}\{x_1, x_2, \dots, x_n\}{x1,x2,,xn}

  • 对每一列,记该列为 x1,x2,...,xnx_1, x_2, ..., x_nx1,x2,...,xn

  • 列的绝对差和为: colsum=∑1≤i<j≤n∣xi−xj∣col_{sum} = ∑_{1 ≤ i < j ≤ n} |x_i - x_j|colsum=1i<jnxixj

  • 总答案为所有列的 colsumcol_{sum}colsum 相加。

核心做法:

  1. 先将每一列排序: y1≤y2≤...≤yny_1 ≤ y_2 ≤ ... ≤ y_ny1y2...yn

  2. 只统计每个数作为“较小的那个数”的贡献: contrib(i)=∑k=i+1n(yk−yi)contrib(i) = ∑_{k=i+1}^{n} (y_k - y_i)contrib(i)=k=i+1n(ykyi)

  3. 每列的答案:colsum=∑i=1ncontrib(i)col_{sum} = ∑_{i=1}^{n} contrib(i)colsum=i=1ncontrib(i)

这样每一对 (i,j)(i<j)(i, j)(i<j)(i,j)i<j只被统计一次,不重不漏,排序保证绝对值可以直接用 yk−yiy_k - y_iykyi 代替。

vector< vector<long long> >a(n + 1 , vector<long long>(m + 1));
  • 使用 n+1n+1n+1m+1m+1m+1 来方便下标从 111 开始。

  • a[i][j]a[i][j]a[i][j] 表示第 iii 行第 jjj 列的数字。

for(int j = 1; j <= m; j++)
{vector<long long>temp;long long sum = 0;for(int i = 1; i <= n; i++)  //每一列{temp.push_back(a[i][j]);sum += a[i][j];}sort(temp.begin() , temp.end());....
}
  1. 对每一列收集所有元素到 temptemptemp

  2. 求该列元素的总和 sumsumsum

  3. 排序,为“贡献法”做准备,使绝对值可以直接用差计算。

long long k = 0;
for(int i = 0; i < n; i++)
{k += temp[i];cost += llabs((sum - k) - (n - i - 1) * temp[i]);
}
  • kkk 用来累加当前列已处理的前 iii 个数的总和。

  • 对于每个位置 iii

    • sum−k=sum - k =sumk= 右边所有元素的总和。

    • (n−i−1)∗temp[i]=(n - i - 1) * temp[i] =(ni1)temp[i]= 当前元素与右边元素的贡献差。

  • llabs(...) 是绝对值函数,累加到 costcostcost

  • 本质:每个数作为较小数时,与右边每个数的差的和。

参考代码

#include <bits/stdc++.h>
using namespace std;int main()
{int t , n , m;cin >> t;while(t--){cin >> n >> m;vector< vector<long long> >a(n + 1 , vector<long long>(m + 1));//n张牌  每一张牌有m个数字for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)cin >> a[i][j];long long cost = 0;for(int j = 1; j <= m; j++){vector<long long>temp;long long sum = 0;for(int i = 1; i <= n; i++)  //每一列{temp.push_back(a[i][j]);sum += a[i][j];}sort(temp.begin() , temp.end());long long k = 0;for(int i = 0; i < n; i++){k += temp[i];cost += llabs((sum - k) - (n - i - 1) * temp[i]);}}cout << cost << endl;}return 0;
}

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

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

相关文章

Jenkins启动端口修改失败查找日志

# 查看Jenkins服务启动时的环境变量sudo systemctl show jenkins | grep -i port从systemd服务信息可以看到&#xff0c;Jenkins的环境变量中 JENKINS_PORT8080&#xff0c;这说明systemd服务配置覆盖了 /etc/default/jenkins 文件中的设置1. 查找Jenkins的systemd服务文件# 查…

Rancher部署的K8S集群服务节点上执行 kubectl 命令

文章目录1、Rancher UI 和执行 kubectl 命令之间的关系1.1、Rancher 的架构和 kubectl1.2、Rancher 内置 kubectl 的位置1.3、执行权限和安全2、Rancher UI 的使用操作2.1、UI 界面内置的 Kubectl 命令工具2.2、在服务节点执行 kubectl 命令的方法2.3、创建一个集群上下文文件 …

基于Nodejs作为服务端,React作为前端框架,axios作为通讯框架,实现滑块验证

文章目录基于Nodejs作为服务端&#xff0c;React作为前端框架&#xff0c;axios作为通讯框架&#xff0c;实现滑块验证1. 为什么要自己写滑块验证2. 滑块验证的整体思路3. 具体实现3.1 服务端3.2 前端4. 总结基于Nodejs作为服务端&#xff0c;React作为前端框架&#xff0c;axi…

2025年物流大数据分析的主要趋势

大数据已为物流行业带来革命性变革&#xff0c;助力实现更智能的运营与实时洞察。如今&#xff0c;企业可精准识别瓶颈、优化供应链&#xff1b;自疫情以来&#xff0c;大数据的采用率大幅攀升&#xff0c;79% 的供应链负责人将分析培训列为优先事项。这一转变不仅提升了效率、…

【C2000常见问题】JTAG仿真器类型和JTAG Debug定位方法

【C2000常见问题】JTAG仿真器类型和JTAG Debug定位方法 母线继电保护动作行为仿真分析系统 【C2000常见问题】JTAG仿真器类型和JTAG Debug定位方法 1问题背景 2问题分析 3可能出现的问题 4JTAG问题总结 1问题背景 某客户产品应用中,使用JTAG仿真器时经常会遇到一启动负载或者…

LT8712SX,Type-C/DP1.4 /eDP转 DP1.4/HD-DVI2.0 带音频

简介LT8712SX是一款高性能Type-C/DP1.4 /eDP转 DP1.4/HD-DVI2.0 带音频,支持4K(3840*2316)60Hz 的分辨率,提供 I2S 和 SPDIF 两个数字音频输出接口&#xff0c;均支持 8 通道 LPCM 或压缩音频&#xff0c;最高采样率为 192KHz。应用场景便携式显示器例如&#xff0c;手机通过 T…

C语言基础:(二十)自定义类型:结构体

目录 前言 一、结构体类型的声明 1.1 结构体回顾 1.1.1 结构体的声明 1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明 1.3 结构的自引用 二、结构体内存对齐 2.1 对齐规则 2.1.1 练习1 2.1.2 练习2 2.1.3 练习3&#xff1a;结构体嵌套问题 2.2 为什…

数据仓库分层解析(详细)

目录 一、数据仓库为什么要分层 二、数据仓库怎么分层 1、ODS&#xff08;Operational Data Store&#xff09;&#xff1a;数据源层 2、DW&#xff08;Data Warehouse&#xff09;&#xff1a; 数据仓库层 2.1、DWD&#xff08;Data Warehouse Detail&#xff09;&#x…

智慧城管云平台源码,微服务vue+element+springboot+uniapp技术架构,数字化综合执法办案系统

智慧城管综合执法系统源码&#xff0c;包括PC端和移动端。微服务架构&#xff0c;vueelementspringbootuniapp技术框架开发。智慧城管建立了统一的城管执法案件数据库、法律法规库、档案信息库等&#xff0c;支持简易程序案件、一般程序案件、行政强制管理等执法业务的办理&…

VUE实现多个弹窗优先级变化实现思路

在开发复杂的单页应用&#xff08;SPA&#xff09;时&#xff0c;我们经常会遇到需要管理多个浮动窗口&#xff08;或称“弹窗”、“面板”&#xff09;的场景。一个核心的用户体验要求是&#xff1a;用户当前操作的窗口应该总是在最顶层。本文将结合代码示例&#xff0c;总结一…

集成算法和kmeans

一、集成算法&#xff08;Ensemble Learning&#xff09; 1. 基本概念 集成学习通过构建并结合多个学习器&#xff08;基分类器/回归器&#xff09;来完成学习任务&#xff0c;旨在通过集体决策提升模型性能&#xff0c;类似于“多个专家的综合判断优于单个专家”。 2. 结合策略…

图数据库性能与可扩展性评估

图数据库的性能与可扩展性直接决定业务场景&#xff08;如实时风控、知识图谱分析&#xff09;的落地效果&#xff0c;需结合业务场景特性&#xff08;OLTP/OLAP&#xff09;、技术指标&#xff08;响应时间、吞吐量&#xff09;和扩展能力&#xff08;数据量/节点扩展&#xf…

树莓派常用的国内镜像源列表以及配置方法

1. 常用的镜像源使用下来发现清华源经常访问不到&#xff0c;阿里源比较好用。其他源还未测试。源名称URL清华源https://pypi.tuna.tsinghua.edu.cn/simple阿里云https://mirrors.aliyun.com/pypi/simple/中科大https://pypi.mirrors.ustc.edu.cn/simple/华为云https://repo.hu…

Transformer在文本、图像和点云数据中的应用——经典工作梳理

摘要 最近在整一些3D检测和分割的任务&#xff0c;接触了一下ptv3&#xff0c;在之前梳理的工作owlv2中用到了vit&#xff0c;去年年假阅读《多模态大模型&#xff1a;算法、应用与微调》&#xff08;刘兆峰&#xff09;时学习了Transformer网络架构及其在文本数据中的应用&am…

训练后数据集后部署PaddleOCR转trt流程

训练后的模型部署&#xff0c;首先要进行训练 0.训练流程见文章 PaddleOCR字符识别&#xff0c;训练自己的数据集全流程&#xff08;环境、标注、训练、推理&#xff09;-CSDN博客文章浏览阅读1.6k次&#xff0c;点赞53次&#xff0c;收藏23次。PaddleOCR是基于百度飞桨框架的…

《MLB美职棒》美国国球是橄榄球还是棒球·棒球5号位

USAs National Sport Showdown: MLB⚾️ vs NFL Ultimate Guide!从商业价值到文化基因&#xff0c;360解析美国体育王座之争&#xff01;添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;️ 历史定位 Historical Roots⚾️ MLB&#xff1a;The "Classi…

常见 Linux 网络命令梳理

在日常运维和排障工作中&#xff0c;网络相关命令是最常用的一类工具。无论是检查网络连通性&#xff0c;还是定位路由问题&#xff0c;又或是分析端口和服务占用&#xff0c;熟悉这些命令都能让我们更高效地解决问题。本文将从几个常见的维度来梳理 Linux 下的网络命令&#x…

Docker 搭建 Gitlab 实现自动部署Vue项目

1、配置要求: 硬件要求: CPU:双核或以上 内存:4GB或以上 软件要求:Centos6 或更高版本 2、gitlab镜像: # 中文版仓库 #docker pull twang2218/gitlab-ce-zh docker pull gitlab/gitlab-ce 3、gitlab部署目录 说明:为了跟其他容器区分,gitlab相关容…

如何解决机器翻译的“幻觉“问题(Hallucination)?

更多内容请见: 机器翻译修炼-专栏介绍和目录 文章目录 一、数据层面优化 二、模型架构改进 三、训练策略调整 四、评估与迭代 五、前沿方向与挑战 六、案例:WMT2023幻觉缓解方案 机器翻译中的“幻觉”(Hallucination)指模型生成与源文本语义无关、逻辑矛盾或事实错误的翻译…

基于STM32+NBIOT设计的宿舍安防控制系统_264

文章目录 1.1 项目介绍 【1】开发背景 【2】实现需求 【3】项目硬件模块组成 【4】设计意义 【5】国内外研究现状 【6】摘要 1.2 系统总体设计 【1】系统功能需求分析 【2】系统总体方案设计 【3】系统工作原理 1.3 系统框架图 1.4 系统功能总结 1.5 系统原理图 1.6 实物图 1.7…