AcWing125. 耍杂技的牛(贪心+推公式)

news/2025/3/15 13:02:51/

题目链接AcWing125. 耍杂技的牛
在这里插入图片描述

分析:
这是一道贪心问题,我们假设牛最终的摆放顺序(从上大小)为1,2,3,...i,i+1,...,n,当存在相邻的两头牛i,i+1如果 w i + s i > w i + 1 + s j + 1 w_i+s_i> w_{i+1}+s_{j+1} wi+si>wi+1+sj+1 那么交换两头牛i,i+1的位置,后所有牛风险值的最大值不会变大。
证明:
首先,可以容易想到交换两头牛i,i+1的位置不会对1~i-1i+1~n牛的风险值产生影响
我们将1~i-1头牛的重量表示为 w 上 w_{上} w
那么,
i头牛的风险值为 w 上 − s i w_{上}-s_i wsi
i+1头牛的风险值为 w 上 + w i − s i + 1 w_{上}+w_i-s_{i+1} w+wisi+1
此时,两头牛i,i+1的最大风险值为 max ⁡ ( w 上 − s i , w 上 + w i − s i + 1 ) \max(w_{上}-s_i,w_{上}+w_i-s_{i+1}) max(wsi,w+wisi+1)
交换两头牛i,i+1的位置后
i头牛的风险值为 w 上 − s i + 1 w_{上}-s_{i+1} wsi+1
i+1头牛的风险值为 w 上 + w i + 1 − s i w_{上}+w_{i+1}-s_{i} w+wi+1si
此时,两头牛i,i+1的最大风险值为 max ⁡ ( w 上 − s i + 1 , w 上 + w i + 1 − s i ) \max(w_{上}-s_{i+1},w_{上}+w_{i+1}-s_{i}) max(wsi+1,w+wi+1si)
因为 w i + s i ≥ w i + 1 + s j + 1 w_i+s_i\geq w_{i+1}+s_{j+1} wi+siwi+1+sj+1 ,所以有 w i − s i + 1 ≥ w i + 1 − s j i w_i-s_{i+1}\geq w_{i+1}-s_{ji} wisi+1wi+1sji
所以有:
w 上 + w i − s i + 1 > w 上 + w i + 1 − s i w_{上}+w_i-s_{i+1}>w_{上}+w_{i+1}-s_{i} w+wisi+1>w+wi+1si
w 上 + w i + 1 − s i > w 上 − s i w_{上}+w_{i+1}-s_{i}>w_{上}-s_i w+wi+1si>wsi
w 上 + w i − s i + 1 > w 上 − s i + 1 w_{上}+w_i-s_{i+1}>w_{上}-s_{i+1} w+wisi+1>wsi+1
所以有 max ⁡ ( w 上 − s i , w 上 + w i − s i + 1 ) > max ⁡ ( w 上 − s i + 1 , w 上 + w i + 1 − s i ) \max(w_{上}-s_i,w_{上}+w_i-s_{i+1})>\max(w_{上}-s_{i+1},w_{上}+w_{i+1}-s_{i}) max(wsi,w+wisi+1)>max(wsi+1,w+wi+1si)
所以,存在相邻的两头牛i,i+1如果 w i + s i > w i + 1 + s j + 1 w_i+s_i> w_{i+1}+s_{j+1} wi+si>wi+1+sj+1 那么交换两头牛i,i+1的位置,后所有牛风险值的最大值会变小。
类似于冒泡排序的思路,可以用贪心的思想来找到该问题的一个最优解,就是按照 w i + s i w_i+s_i wi+si从小到大的顺序从高往低摆放牛

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=5e4+10;
typedef pair<int,int> pii;
typedef long long ll;
vector<pii> v;int main(){int n;int res=-1e9;cin>>n;for(int i=0;i<n;i++){int w,s;scanf("%d%d",&w,&s);v.push_back({w+s,w});}sort(v.begin(),v.end());ll ans=0;for(int i=0;i<v.size();i++){if(ans-v[i].first+v[i].second>res) res=ans-v[i].first+v[i].second;ans+=v[i].second;}cout<<res;return 0;
}

http://www.ppmy.cn/news/1279221.html

相关文章

多维时序 | MATLAB实现SSA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现SSA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现SSA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN-LST…

如何信任机器学习模型的预测结果?

机器学习已经在企业中得到了广泛应用。最近在与不同企业的交流中发现&#xff0c;机器学习模型预测结果的可信性得到越来越多的关注。 也就是说&#xff0c;如何确定机器学习模型预测的结果是符合常理的&#xff0c;进而确定所选择的机器学习模型是可信的。 关于这个问题&…

liunx安装Docker Compose

你可以按照以下步骤安装 Docker Compose&#xff1a; 首先&#xff0c;确保你已经安装了 Docker。Docker Compose 是 Docker 的一个独立组件&#xff0c;通常不会随 Docker 一起安装。 1&#xff0c;使用以下命令下载 Docker Compose 的二进制文件&#xff1a; bash sudo c…

ubuntu22.04+ROS2推荐匹配的gazebo版本

放大以后看到&#xff1a; 可以看到ros2推荐使用版本是humble-----匹配的是Ubuntu22.04LTS -------匹配gazebo Harmonic

redis常见数据类型

目录 1.基本全局命令 2.数据结构和内部编码 3.单线程架构 1.基本全局命令 Redis有5种数据结构,但它们都是键值对种的值&#xff0c;对于键来说有一些通用的命令。 KEYS 返回所有满足样式(pattern) 的key。支持如下统配样式。 h?llo 匹配 hello, hallo和hxllo h*llo匹配h…

TrustZone之与非安全虚拟化交互

到目前为止&#xff0c;我们在示例中忽略了非安全状态中可能存在的虚拟化程序。当存在虚拟化程序时&#xff0c;虚拟机与安全状态之间的许多通信将通过虚拟化程序进行。 例如&#xff0c;在虚拟化环境中&#xff0c;SMC用于访问固件功能和可信服务。固件功能包括诸如电源管理之…

Canal使用详解

Canal介绍 Canal是阿里巴巴开发的MySQL binlog增量订阅&消费组件&#xff0c;Canal是基于MySQL二进制日志的高性能数据同步系统。在阿里巴巴集团中被广泛使用&#xff0c;以提供可靠的低延迟增量数据管道。Canal Server能够解析MySQL Binlog并订阅数据更改&#xff0c;而C…

Laravel框架使用phpstudy本地安装的composer用Laravel 安装器进行安装搭建

一、首先需要安装Laravel 安装器 composer global require laravel/installer 二、安装器安装好后&#xff0c;可以使用如下命令创建项目 laravel new sys 三、本地运行 php artisan serve 四、 使用Composer快速安装Laravel5.8框架 安装指定版本的最新版本&#xff08;推荐&a…