C++课后习题训练记录Day82

1.练习项目:

问题描述

在一款名为"大石头的搬运工"的游戏中,玩家需要操作一排 n 堆石头,进行 n−1 轮游戏。

每一轮,玩家可以选择一堆石头,并将其移动到任意位置。

在 n−1 轮移动结束时,要求将所有的石头移动到一起(即所有石头的位置相同)即为成功。

移动的费用为石头的重量乘以移动的距离。例如,如果一堆重量为 2 的石头从位置 3 移动到位置 5,那么费用为 2×(5−3)=4。

请计算出所有合法方案中,将所有石头移动到一起的最小费用。

可能有多堆石头在同一个位置上,但是一轮只能选择移动其中一堆。

输入格式

第一行一个整数 n,表示石头的数量。

接下来 n 行,每行两个整数 wi 和 pi,分别表示第 i 堆石头的重量和初始位置。

输出格式

输出一个整数,表示最小的总移动费用。

说明

一种最优的移动方式是:

首先,将第一个石头移动到位置 1,费用为 2×(3−1)=4;

然后,将第三个石头移动到位置 1,费用为 1×(5−1)=4。

所以最小的总移动费用为 4+4=8。

数据范围

对于 20% 的测试样例,1≤n≤1e3。

对于 100% 的测试样例,1≤n≤1e5,1≤wi,pi≤1e6。

2.选择课程

在蓝桥云课中选择课程《16届蓝桥杯省赛无忧班(C&C++ 组)4期》,选择第二章"基础算法"编程20并开始练习。

3.开始练习

(1)前缀和思想:

#include<bits/stdc++.h>

using namespace std;

using ll=long long;

const int N=1e5+10;

pair<ll,ll>aN;

int main()

{

ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

int n;cin>>n;

ll sum1N,sum2N;

for(int i=1;i<=n;i++){

cin>>ai.second>>ai.first;

}

sort(a+1,a+n+1);

ll s=0;

for(int i=1;i<=n;i++){

sum1i=sum1i-1;

sum1i+=s*(ai.first-ai-1.first);

s+=ai.second;

}

s=0;

for(int i=n;i>=1;i--){

sum2i=sum2i+1;

sum2i+=s*(ai+1.first-ai.first);

s+=ai.second;

}

ll res=1e18;

for(int i=1;i<=n;i++){

res=min(res,sum1i+sum2i);

}

cout<<res<<'\n';

return 0;

}

(2)加权平均数思想:

#include<bits/stdc++.h>

using namespace std;

using ll = long long;

int main() {

ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

int n; cin >> n;

vector<pair<ll, ll>> stones(n); // (位置, 重量)

ll total_weight = 0;

for(int i = 0; i < n; i++) {

ll w, p; cin >> w >> p;

stonesi = {p, w};

total_weight += w;

}

// 按位置排序

sort(stones.begin(), stones.end());

// 找加权中位数

ll half = (total_weight + 1) / 2; // 向上取整

ll cur_weight = 0;

ll target = 0;

for(auto& pos, w : stones) {

cur_weight += w;

if(cur_weight >= half) {

target = pos;

break;

}

}

// 计算总成本

ll cost = 0;

for(auto& pos, w : stones) {

cost += w * abs(pos - target);

}

cout << cost << '\n';

return 0;

}

(3)检验结果

对此代码进行检验,检验后无报错,提交此代码,判题结果为正确100分。

(4)练习心得:注意每段代码末尾的分号是否存在,如不存在则需即使补充;输入法是否切换为英语模式;语法是否错误。

相关推荐
第九序言T12 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Sakura_j_h_13 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
龙亘川14 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人14 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
Raas10014 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
专注仿真15 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法
jimy116 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
呆呆虫1216 小时前
用 orjson 加速 SerpBase 响应解析:基准对比与注意事项
开发语言·php
心疼你的一切16 小时前
Python自动发邮件实战定时发报表
大数据·开发语言·python
Wang's Blog17 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友