PAT 1018 Public Bike Management

个人学习记录,代码难免不尽人意。

There is a public bike service in Hangzhou City which provides great convenience to the tourists from all over the world. One may rent a bike at any station and return it to any other stations in the city.

The Public Bike Management Center (PBMC) keeps monitoring the real-time capacity of all the stations. A station is said to be in perfect condition if it is exactly half-full. If a station is full or empty, PBMC will collect or send bikes to adjust the condition of that station to perfect. And more, all the stations on the way will be adjusted as well.

When a problem station is reported, PBMC will always choose the shortest path to reach that station. If there are more than one shortest path, the one that requires the least number of bikes sent from PBMC will be chosen.
在这里插入图片描述
在这里插入图片描述
Sample Input:
10 3 3 5
6 7 0
0 1 1
0 2 1
0 3 3
1 3 1
2 3 1
Sample Output:
3 0->2->3 0

一开始我只用了dijkstra,结果只得到了23分。

#include <cstdio>
#include<set>
#include<string>
#include<algorithm>
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int cmax,n,sp,m;
const int maxn=510;
const int INF=1000000000;
int C[maxn];
int G[maxn][maxn];
int sent[maxn];
int take[maxn];
int d[maxn];
int pre[maxn];
bool visit[maxn]; 
void dijkstra(int st){fill(visit,visit+n+1,false);fill(d,d+n+1,INF);sent[st]=0;take[st]=0;d[st]=0;for(int i=0;i<=n;i++){int m=-1,min=INF;for(int j=0;j<=n;j++){if(!visit[j]&&d[j]<min){min=d[j];m=j;}}if(m==-1) return;visit[m]=true;for(int j=0;j<=n;j++){if(!visit[j]&&G[m][j]!=INF&&d[j]>d[m]+G[m][j]){d[j]=d[m]+G[m][j];
//				cout << "m=" << m <<"C[j]=" << C[j] <<endl; if(cmax/2-C[j]==0){sent[j]=sent[m];take[j]=sent[m];}else if(cmax/2-C[j]<0){//需要拿走 sent[j]=sent[m];take[j]=take[m]+abs(cmax/2-C[j]);}else{//需要带来 sent[j]=max(0,(cmax/2-C[j])-take[m]);take[j]=max(0,take[m]-(cmax/2-C[j]));}pre[j]=m;}else if(!visit[j]&&G[m][j]!=INF&&d[j]==d[m]+G[m][j]){if(cmax/2-C[j]==0){if(sent[j]>sent[m]){sent[j]=sent[m];take[j]=take[m];pre[j]=m;}}else if(cmax/2-C[j]<0){//需要拿走 if(sent[j]>sent[m]){sent[j]=sent[m];take[j]=take[m]+abs(cmax/2-C[j]);pre[j]=m;}}else{//需要带来 if(sent[j]>max(0,(cmax/2-C[j])-take[m])){sent[j]=max(0,(cmax/2-C[j])-take[m]);take[j]=max(0,take[m]-(cmax/2-C[j]));pre[j]=m;}}}}}
}
void dfs(int num){if(pre[num]==num){printf("%d",num);return;}dfs(pre[num]);printf("->%d",num);
}
int main(){scanf("%d%d%d%d",&cmax,&n,&sp,&m);C[0]=0;pre[0]=0;for(int i=1;i<=n;i++){scanf("%d",&C[i]);}for(int i=0;i<=n;i++){for(int j=0;j<=n;j++){G[i][j]=INF;}}for(int i=1;i<=m;i++){int a,b,dis;scanf("%d%d%d",&a,&b,&dis);G[a][b]=dis;G[b][a]=dis;}dijkstra(0);
//  for(int i=0;i<n+1;i++){
//  	printf("%d ",take[i]);
//  }
//  for(int i=0;i<n+1;i++){
//  	printf("%d ",sent[i]);
//  }printf("%d ",sent[sp]);dfs(sp);printf(" %d\n",take[sp]);}

后来我看了答案才发现不能只使用dijkstra方法来做,因为路径不满足最优子结构,必须采用dijkstra和dfs的方法来做。
正确代码如下:

//1018 Public Bike Management(30 分)
#include<cstdio>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXV = 510;
const int INF = 1000000000;
int n, m, Cmax, Sp, numPath = 0, G[MAXV][MAXV], weight[MAXV];
int d[MAXV], minNeed = INF, minRemain = INF;//minNeed记录最少携带的数目,minRemain记录最少带回的数目
bool vis[MAXV] = { false };
vector<int>pre[MAXV];
vector<int>tempPath, path;
void Dijkstra(int s) {fill(d, d + MAXV, INF);d[s] = 0;for (int i = 0; i <= n; i++) {int u = -1, MIN = INF;for (int j = 0; j <= n; j++) {if (vis[j] == false && d[j] < MIN) {u = j;MIN = d[j];}}if (u == -1)return;vis[u] = true;for (int v = 0; v <= n; v++) {if (vis[v] == false && G[u][v] != INF) {if (d[u] + G[u][v] < d[v]) {d[v] = d[u] + G[u][v];pre[v].clear();pre[v].push_back(u);}else if (d[v] == d[u] + G[u][v])pre[v].push_back(u);}}}
}
void DFS(int v) {if (v == 0) {tempPath.push_back(v);//计算最短路径标尺int need = 0, remain = 0;for (int i = tempPath.size() - 1; i >= 0; i--) {int id = tempPath[i];if (weight[id] > 0) {//如果当前节点点权为正,说明需要收走自行车,收走数量为点权值remain += weight[id];}else {//如果点权为负,则从前面收走的remain中向该节点投放自行车if (remain > abs(weight[id]))remain -= abs(weight[id]);else {//如果不够投放,需要从PBMC携带need += abs(weight[id]) - remain;remain = 0;//当前持有的自行车全部用来补给}}}if (need < minNeed) {//最短路径相同,选择需要从PBMC带的最少的情况minNeed = need;minRemain = remain;path = tempPath;}else if (need == minNeed && remain < minRemain) {//need还相同,选择remain少的情况minRemain = remain;path = tempPath;}tempPath.pop_back();return;}tempPath.push_back(v);for (int i = 0; i < pre[v].size(); i++) {DFS(pre[v][i]);}tempPath.pop_back();
}
int main() {(void)scanf("%d %d %d %d", &Cmax, &n, &Sp, &m);int u, v;fill(G[0], G[0] + MAXV * MAXV, INF);for (int i = 1; i <= n; i++) {(void)scanf("%d", &weight[i]);weight[i] -= Cmax / 2;//点权减去容量的一半,计算距离prefect还差多少}for (int i = 0; i < m; i++) {(void)scanf("%d %d", &u, &v);(void)scanf("%d", &G[u][v]);G[v][u] = G[u][v];}Dijkstra(0);DFS(Sp);printf("%d ", minNeed);for (int i = path.size() - 1; i >= 0; i--) {//路径的顺序是倒序存放的printf("%d", path[i]);if (i > 0)printf("->");}printf(" %d", minRemain);return 0;
}

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

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

相关文章

Java进阶(3)——手动实现ArrayList 源码的初步理解分析 数组插入数据和删除数据的问题

目录 引出手动实现ArrayList定义接口MyList<T>写ArrayList的实现类增加元素删除元素 写测试类进行测试数组插入数据? 总结 引出 1.ArrayList的结构分析&#xff0c;可迭代接口&#xff0c;是List的实现&#xff1b; 2.数组增加元素和删除元素的分析&#xff0c;何时扩容…

煤矿调度IP语音对讲广播模块一键求助对讲矿用调度通信系统SIP语音对讲求助终端

硬件接口描述 SV-2101VP/ SV-2103VP系列网络音频模块&#xff0c;所有外部连接采用端子&#xff0c;电源采用2.0mm的端子&#xff0c;网络采用标准RJ45连接器&#xff0c;其他都是1.25mm的连接器。 端口类型定义 P ———— 电源 AI ———— 模拟输入&#xff08;在这里是音…

《人工智能大模型体验报告2.0》发布

ChatGPT 崛起引发新一轮生成式AI热潮&#xff0c;国内科技企业纷纷布局。据不完全统计&#xff0c;截至目前&#xff0c;国内大模型数量已达上百个。在这些大模型中&#xff0c;谁的表现最好&#xff0c;智能性最高&#xff0c;用户体验最强&#xff1f;8月12日&#xff0c;新华…

谈谈召回率(R值),准确率(P值)及F值

通俗解释机器学习中的召回率、精确率、准确率&#xff0c;一文让你一辈子忘不掉这两个词 赶时间的同学们看这里&#xff1a;提升精确率是为了不错报、提升召回率是为了不漏报 先说个题外话&#xff0c;暴击一下乱写博客的人&#xff0c;网络上很多地方分不清准确率和精确率&am…

仿牛客论坛项目day7|Kafka

一、阻塞队列 创建了一个生产者线程和一个消费者线程。生产者线程向队列中放入元素&#xff0c;消费者线程从队列中取出元素。我们可以看到&#xff0c;当队列为空时&#xff0c;消费者线程会被阻塞&#xff0c;直到生产者线程向队列中放入新的元素。 二、Kafka入门 发布、订阅…

线性代数3,什么是向量 向量空间(草稿,建设ing)

列向量 行向量 4 什么是向量空间&#xff0c;向量的张成空间 域&#xff0c;组等概念 空间 向量空间 张成空间 6 线性代数 普通代数&#xff0c;是以单个的数为研究对象的数学 线性代数本质是以数组&#xff08;数组/向量&#xff1a;多个数为整体&#xff09;为基本对象的…

Mathematica 与 Matlab 常见复杂指令集汇编

Mathematica 常见指令汇编 Mathematica 常见指令 NDSolve 求解结果的保存 sol NDSolve[{y[x] x^2, y[0] 0, g[x] -y[x]^2, g[0] 1}, {y, g}, {x, 0, 1}]; numericSoly sol[[1, 1, 2]]; numericSolg sol[[1, 2, 2]]; data Table[{x, numericSoly[x], numericSolg[x]},…

其他行业跳槽转入计算机领域简单看法

其他行业跳槽转入计算机领域简单看法 本人选择从以下几个方向谈谈自己的想法和观点。 先看一下总体图&#xff0c;下面会详细分析 如何规划才能实现转码 自我评估和目标设定&#xff1a;首先&#xff0c;你需要评估自己的技能和兴趣&#xff0c;确定你希望在计算机领域从事…

机器视觉应用开发什么最重要?

&#xff08;QQ群有答疑&#xff09;零基础小白快速上手海康VisionMaster开发系列课程 高级语言在机器视觉就是工具&#xff0c;机器视觉软件&#xff0c;在机器视觉中也是工具&#xff0c;在机器视觉应用开发中&#xff0c;图像处理是最重要的&#xff0c;一切看图像&#xff…

leetcode做题笔记85最大矩形

给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例 1&#xff1a; 思路一&#xff1a;单调栈 int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize){int dp[matrixSize…

06-微信小程序-注册程序-场景值

06-微信小程序-注册程序 文章目录 注册小程序参数 Object object案例代码 场景值场景值作用场景值列表案例代码 注册小程序 每个小程序都需要在 app.js 中调用 App 方法注册小程序实例&#xff0c;绑定生命周期回调函数、错误监听和页面不存在监听函数等。 详细的参数含义和使…

[C++]笔记 - 知识点积累

一.运算符的优先级 一共15个级别 最高优先级 : () []最低优先级 :逗号表达式倒数第二低优先级 : 赋值和符合赋值(,,-...) ! >算术运算符 > 关系运算符 > && >> || >赋值运算符 二.数据类型转换 隐式类型转换 算数转换 char int long longlong flo…

【NepCTF2023】复现

文章目录 【NepCTF2023】复现MISC与AI共舞的哈夫曼codesc语言获取环境变量 小叮弹钢琴陌生的语言你也喜欢三月七么Ez_BASIC_IImisc参考 WEBez_java_checkinPost Crad For You独步天下配置环境独步天下-镜花水月环境变量提权 独步天下-破除虚妄总结 独步天下-破除试炼_加冕成王知…

Qt应用开发(基础篇)——MDI窗口 QMdiArea QMdiSubWindow

一、前言 QMdiArea类继承于QAbstractScrollArea&#xff0c;QAbstractScrollArea继承于QFrame&#xff0c;是Qt用来显示MDI窗口的部件。 滚屏区域基类 QAbstractScrollAreahttps://blog.csdn.net/u014491932/article/details/132245486 框架类 QFramehttps://blog.csdn.net/u01…

案例: 用户消费数据分析--Pandas

1. 数据读入 2. 数据处理–日期处理 3. 用户整体消费趋势分析 4. 用户个体消费分析 4.1 用户消费数量与消费金额关系的散点图 4.2 每位用户消费金额分布 4.2.1 消费金额贡献度折线图 用户贡献度折线图 4.2.2 消费金额占比前80%的客户&#xff0c;消费分布直方图 4.3 消费时…

传输层协议

传输层协议 再谈端口号端口号范围划分认识知名端口号两个问题netstatpidof UDP协议UDP协议端格式UDP的特点面向数据报UDP的缓冲区UDP使用注意事项基于UDP的应用层协议 TCP协议TCP协议段格式确认应答(ACK)机制超时重传机制连接管理机制理解 CLOSE_WAIT 状态理解TIME_WAIT状态解决…

SQL | 分组数据

10-分组数据 两个新的select子句&#xff1a;group by子句和having子句。 10.1-数据分组 上面我们学到了&#xff0c;使用SQL中的聚集函数可以汇总数据&#xff0c;这样&#xff0c;我们就能够对行进行计数&#xff0c;计算和&#xff0c;计算平均数。 目前为止&#xff0c…

鸿蒙剥离 AOSP 不兼容 Android 热门问题汇总,不吹不黑不吵

上周发了一篇 《鸿蒙终于不套壳了&#xff1f;纯血 HarmonyOS NEXT 即将到来》的相关资讯&#xff0c;没想到大家「讨&#xff08;fa&#xff09;论&#xff08;xie&#xff09;」的热情很高&#xff0c;莫名蹭了一波流量&#xff0c;虽然流量对我来说也没什么用&#xff0c;但…

Golang 基础语法问答

使用值为 nil 的 slice、map 会发生什么&#xff1f; 允许对值为 nil 的 slice 添加元素&#xff0c;但是对值为 nil 的 map 添加元素时会造成运行时 panic。 // map错误示例 func main() {var m map[string]intm["one"] 1 // error: panic: assignment to entry …

bert,transformer架构图及面试题

Transformer详解 - mathor atten之后经过一个全连接层残差层归一化 class BertSelfOutput(nn.Module):def __init__(self, config):super().__init__()self.dense nn.Linear(config.hidden_size, config.hidden_size)self.LayerNorm nn.LayerNorm(config.hidden_size, epscon…