【算法】环形纸牌均分问题

104. 货仓选址 - AcWing题库

有n家商店,求把货仓建在哪能使得货仓到每个点的距离总和最小,输出最短的距离总和。

首先,我们看只有两个点的情况,在这种情况下我们选[1,2]的任何一个位置都是一样的,总和就是这段区间的长度,对吧。

如果扩展到n个点呢?我们两两配对来看。

首先只看1,n这个区间,那么这个点选在[1,n]都是等价的对吧,而且是最优的。因此,我们缩小范围到[1,n]。

再来看看2,6这段呢,选在[2,6]是不是也是答案最优的?因此我们进一步缩小范围。

3,5这段,进一步缩小范围到[3,5]。

此时只剩下一个点4了,选在点上肯定比不在点上要好。因此我们的答案就是4了。

如果正好是偶数个呢?那我们是不是选在最中间区间内的任一一点就好了,因为最后答案就是这几段小区间的长度之和。

具体到代码上呢,奇数就选最中间那个点,n/2+1。偶数,n/2或者n/2+1都可。我们直接一般化输出n/2+1。也就是数组的中位数

#include<bits/stdc++.h>
using ll=long long;
const int N=2e5+10;
int n,m,k;
int a[N];
ll ans;
void solve()
{std::cin>>n;for(int i=1;i<=n;i++){std::cin>>a[i];	}	std::sort(a+1,1+a+n);for(int i=1;i<=n;i++){ans+=std::abs(a[i]-a[n/2+1]);} std::cout<<ans;
}
signed main()
{std::ios::sync_with_stdio(false);std::cin.tie(0);int t=1;//std::cin>>t;while(t--){solve();}return 0;
}

我们推广到一般情况:

P1031 [NOIP2002 提高组] 均分纸牌 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

首先来看线性均分纸牌问题。

为什么可以这样写?

这段代码成立的基础就在于只能移给相邻的堆。那么,1只能跟2交换以达到target,1换好之后2就只能跟3交换(因为如果1跟2又换了1就不是target了,而且说明前面做了无用功,答案一定不是最优的)。因此可以这样一条线递推。

(感觉这个递推思想有点类似于费解的开关,每个灯能改变上下左右相邻的状态,第一行的灯只能由第二行改变,一旦第一行灯的状态确定了,则第二行、第三行......第n行的状态也就确定了。所以那题就枚举第一行的状态就行)。

#include<bits/stdc++.h>
using ll=long long;
const int N=2e5+10;
const int mod=1e9+7;
int a[N];
int n;
ll s=0,cnt;
void solve()
{std::cin>>n;for(int i=1;i<=n;i++){std::cin>>a[i];s+=a[i];}s/=n;for(int i=1;i<=n;i++){if(a[i]<s) a[i+1]-=s-a[i],cnt++;if(a[i]>s) a[i+1]+=a[i]-s,cnt++;a[i]=s;}std::cout<<cnt<<'\n';
}
signed main()
{std::ios::sync_with_stdio(false);std::cin.tie(0);int t=1;//std::cin>>t;while(t--){solve();}return 0;
}

122. 糖果传递 - AcWing题库

n个小朋友坐一圈,每人只能给左右两人传递糖果。 

这题跟上面唯一的不同就在于,围成了一个圈。我们想想上一题递推的突破口是什么呢?是1!因为只有2跟他换。对于这个问题能不能破环成链呢?

我们为什么需要这样一个接一个的传递糖果?因为糖果只能给相邻的小朋友,我要把多的移走对吧。

倘若盯着一个人看,让它当第一个操作的人。我刚把糖果移走,你为什么要还给我?这样是不是说明做了无用功,因为给出去的糖果又回到我手上了!因此,势必有一个小孩得到/失去糖果之后就不再与别人操作了!那么,谁来当第一个交换的小孩呢?

举个栗子!

可以看到这个问题就转化成了绝对值求和的问题!抽象成了一个数学问题,也就是x1取ci中位数的时候能够有最小值sum。

#include<bits/stdc++.h>
using ll=long long;
const int N=1e6+10;
const int mod=1e9+7;
int a[N],sum[N];
int n;
ll s=0,cnt;
void solve()
{std::cin>>n;for(int i=1;i<=n;i++){std::cin>>a[i];s+=a[i];}s/=n;for(int i=1;i<=n;i++){a[i]-=s;sum[i]=sum[i-1]+a[i];//公式里的c数组 }std::sort(sum+1,sum+1+n);int mid=n/2+1;//中位数for(int i=1;i<=n;i++){cnt+=std::abs(sum[mid]-sum[i]);	} std::cout<<cnt<<'\n';
}
signed main()
{std::ios::sync_with_stdio(false);std::cin.tie(0);int t=1;//std::cin>>t;while(t--){solve();}return 0;
}

105. 七夕祭 - AcWing题库

布置场地,让每行感兴趣的摊点数一样多,每列感兴趣的摊点数一样多。同手每行/每列第一个和最后一个位置算做相邻。求解交换两个摊点的最少次数。

首先看到”算做相邻“,”均摊“很容易想到上面的环形均摊纸牌的算法对吧。但是这题不同点在于,对每行每列都有要求。 但是,当我们交换两个摊点的时候,只会改变要么行要么列的状态。左右交换的时候,只会改变这两列的点数。上下交换的时候,只会改变这两行的点数。因此,我们把这个问题分割成两个。左右交换的最少次数,和上下交换的最少次数。这样就又变成了上面的糖果传递问题。

#include<bits/stdc++.h>
using ll=long long;
const int N=1e5+10;
const int mod=1e9+7;
int row[N],col[N],sr[N],sl[N];
int n,m,s;
ll cnt1=-1,cnt2=-1;
void solve()
{std::cin>>n>>m>>s;for(int i=1;i<=s;i++){int x,y;std::cin>>x>>y;row[x]++,col[y]++;}if(s%n==0)//对行 {cnt1=0;int t=s/n;for(int i=1;i<=n;i++){row[i]-=t;sr[i]=sr[i-1]+row[i];	}  std::sort(sr+1,sr+1+n);int mid=1+n/2;for(int i=1;i<=n;i++){cnt1+=std::abs(sr[i]-sr[mid]);}}if(s%m==0)//对列{cnt2=0;int t=s/m;for(int i=1;i<=m;i++){col[i]-=t;sl[i]=sl[i-1]+col[i];	}  std::sort(sl+1,sl+1+m);int mid=1+m/2;for(int i=1;i<=m;i++){cnt2+=std::abs(sl[i]-sl[mid]);}}if(cnt1==-1&&cnt2==-1){std::cout<<"impossible"<<'\n';}else{if(cnt1!=-1&&cnt2!=-1){std::cout<<"both"<<' ';std::cout<<cnt1+cnt2<<'\n';}else if(cnt1!=-1){std::cout<<"row"<<' ';std::cout<<cnt1<<'\n';}else{std::cout<<"column"<<' ';std::cout<<cnt2<<'\n';}}
}
signed main()
{std::ios::sync_with_stdio(false);std::cin.tie(0);int t=1;//std::cin>>t;while(t--){solve();}return 0;
}

写进一个函数里。

#include<bits/stdc++.h>
using ll=long long;
const int N=1e5+10;
const int mod=1e9+7;
int row[N],col[N],sr[N];
int n,m,s;
ll cnt1,cnt2;
ll calc(int nn,int h[])
{ll cnt=-1;if(s%nn==0){cnt=0;int t=s/nn;for(int i=1;i<=nn;i++){h[i]-=t;sr[i]=sr[i-1]+h[i];	}  std::sort(sr+1,sr+1+nn);int mid=1+nn/2;for(int i=1;i<=nn;i++){cnt+=std::abs(sr[i]-sr[mid]);}}return cnt;
}
void solve()
{std::cin>>n>>m>>s;for(int i=1;i<=s;i++){int x,y;std::cin>>x>>y;row[x]++,col[y]++;}cnt1=calc(n,row);cnt2=calc(m,col);if(cnt1==-1&&cnt2==-1){std::cout<<"impossible"<<'\n';}else{if(cnt1!=-1&&cnt2!=-1){std::cout<<"both"<<' ';std::cout<<cnt1+cnt2<<'\n';}else if(cnt1!=-1){std::cout<<"row"<<' ';std::cout<<cnt1<<'\n';}else{std::cout<<"column"<<' ';std::cout<<cnt2<<'\n';}}
}
signed main()
{std::ios::sync_with_stdio(false);std::cin.tie(0);int t=1;//std::cin>>t;while(t--){solve();}return 0;
}

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

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

相关文章

【机器学习】包裹式特征选择之序列前向选择法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

证书(公钥):网络安全的关键

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

eBMC套件固件烧录及上电过程

1 概述 本期讲解 eBMC 套件上电和固件烧录过程。关于 eBMC 套件的开关、接口和芯片位置&#xff0c;可查看前两期文章&#xff0c;里面有详细描述。 2 固件烧录 eBMC 套件烧录涉及以下固件、其芯片位置和烧录口位置&#xff1a; 其中&#xff0c;eBMC-D4 板上固件可…

『Apisix进阶篇』动态负载均衡:APISIX的实战演练与策略应用

&#x1f680;『Apisix系列文章』探索新一代微服务体系下的API管理新范式与最佳实践 【点击此跳转】 &#x1f4e3;读完这篇文章里你能收获到 &#x1f3af; 掌握APISIX中多种负载均衡策略的原理及其适用场景。&#x1f4c8; 学习如何通过APISIX的Admin API和Dashboard进行负…

软考100-上午题-【信息安全】-网络攻击

一、常见的网络攻击 拒绝服务攻击(Dos攻击)&#xff1a;目的是使计算机或网络无法提供正常的服务 拒绝服务攻击是不断向计算机发起请求来实现的&#xff0c;是一种网络攻击手段。 攻击者通过向目标服务器发送大量的无效请求&#xff0c;如TCP连接请求、HTTP请求等&#xff0…

IS-IS路由

概览&#xff1a; Intermediate System-to-Intermediate System&#xff0c;中间系统到中间系统协议 IS-IS--IGP--链路状态协议--AD值&#xff1a;115 IS--中间系统&#xff08;路由器&#xff09; ES--终端系统&#xff08;PC&#xff09; 在早期IS-IS的开发并不是为了IP…

Matlab|基于隐式Zbus高斯法的三相不平衡潮流计算【可设定变压器数量和位置】【Yy、Yd两种绕组方式】

目录 主要内容 部分代码 结果一览 主要内容 该模型基于隐式高斯法实现对配电网的三相不平衡潮流计算&#xff0c;通过选项可实现【不含变压器】和【含变压器】两种方式下的潮流计算&#xff0c;并且通过参数设置可实现多个变压器接入&#xff0c;该程序可计算【IE…

AI视频风格转换动漫风:Stable Diffusion+TemporalKit

话不多说&#xff0c;直接开干。 基本方法 首先通过 Temporal-Kit 这个插件提取视频中的关键帧图片&#xff0c;然后使用 Stable Diffusion WebUI 重绘关键帧图片&#xff0c;然后再使用 Temporal-Kit 处理转换后的关键帧图片&#xff0c;它会自动补充关键帧之间的图片&#…

C++ STL - 优先级队列及其模拟实现

目录 0. 引言 1. priority_queue 介绍 1.1 构造函数 1.2 priority_queue 接口函数使用 1.3 仿函数 1.4 题目练习 2. priority_queue 模拟实现 2.1基本框架&#xff1a; 2.2 默认构造函数 2.3 基本函数 2.4 堆的向上以及向下调整 0. 引言 优先队列 (priority_queu…

分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测

分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测 目录 分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测分类效果基本介绍模型描述程序设计参…

计算机网络(二)物理层

物理层 一、通信基础1.奈氏准则、香农定理2.编码与调制3.电路交换、报文交换、分组交换 二、 传输介质、设备1.导向性传输介质&#xff1a;1.1双绞线1.2 同轴电缆1.3光纤 2.非导向性传输介质&#xff1a; 一、通信基础 信道带宽&#xff1a;信道能通过的最高频率和最低频率之差…

Python爬虫学习完整版

一、什么是爬虫 网络爬虫&#xff0c;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性&#xff0c;根据用户需求定向抓取相关网页并分析也成为如今主流的爬取策略。 1 爬虫可以做什么 你可以爬取网络上的的图片&#…

鸿蒙雄起!风口就在当下,你如何抉择?

近年来&#xff0c;华为自主研发的鸿蒙操作系统&#xff08;HarmonyOS&#xff09;引起了广泛的关注和讨论。鸿蒙系统不仅标志着华为在软件领域的一次重大突破&#xff0c;也预示着全球智能设备市场格局的潜在变化。本文将深入探讨鸿蒙系统的兴起、其在市场上的表现以及对程序员…

刚刚,百度和苹果宣布联名

百度 Apple 就在刚刚&#xff0c;财联社报道&#xff0c;百度将为苹果今年发布的 iPhone16、Mac 系统和 iOS18 提供 AI 功能。 苹果曾与阿里以及另外一家国产大模型公司进行过洽谈&#xff0c;最后确定由百度提供这项服务&#xff0c;苹果预计采取 API 接口的方式计费。 苹果将…

【AI漏洞】人工而后智能

注&#xff1a;公众号暂时不再使用了 本文主要内容&#xff1a; 1、主题&#xff1a;AI漏洞 2、过程&#xff1a;测试步骤 3、笔者&#xff1a;寄语 &#xff08;重点&#xff1a;本文只做技术研究&#xff0c;请遵守相关法律法规&#xff0c;发现自身单位有漏洞请及时修复&…

C语言指针详解(上)

一.什么是指针 指针是一种类型&#xff0c;用来存储变量的地址的类型 有哪些类型呢 字符指针&#xff1a;char* 整型指针&#xff1a;int* 浮点型指针&#xff1a;float* 双精度浮点型指针&#xff1a;double* 空指针&#xff1a;void* &#xff08;每一个类型的指针&a…

搜维尔科技:【应急演练】【工业仿真】救援模拟演练可视化仿真项目实施

安全救援综合演练系统是一套面向公共安全事故、预案管理、应急救援模拟演练的虚拟仿真解决方案&#xff0c;它为警察、消防以及专门的应急救援保障部门提供一个综合的应急救援培训和仿真演练平台。平台主要通过设计不同的事故模型和特定的灾难场景&#xff0c;定制不同的应急救…

Phoenix伪分布安装

引言 Phoenix是构建在HBase上的一个SQL层&#xff0c;能让我们用标准的JDBC APIs而不是HBase客户端APIs来创建表&#xff0c;插入数据和对HBase数据进行查询。Phoenix完全使用Java编写&#xff0c;作为HBase内嵌的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫…

大话设计模式之模板方法模式

模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个算法的框架&#xff0c;将特定步骤的实现延迟到子类中。模板方法模式通过在父类中定义算法的骨架&#xff0c;而将具体步骤的实现留给子类来完成&#xff0c;从而使子类…

Python学习之-正则表达式

目录 前言&#xff1a;1.re.serach1.1例子&#xff1a; 2.re.match2.1示例1&#xff1a;2.2 示例2&#xff1a; 3.re.findall3.1 示例 4.re.fullmatch4.1 示例1&#xff1a;4.2 示例2: 5.re.split5.1 示例1:5.2 示例2&#xff1a;5.3 示例3&#xff1a; 6.re.sub6.1 示例&#…