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.pswp.cn/news/42357.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42357.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42357.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【實用插件】ArcGIS for AutoCAD插件分享下載

ArcGIS包含一系列功能&#xff0c;其中ArcGIS for AutoCAD一個免費的可下載的AutoCAD插件&#xff0c;它可簡化將CAD和GIS數據整合在一起的過程提供互操作性。 ArcGIS for AutoCAD互操作性平臺將連接AutoCAD和 ArcGIS&#xff0c;以增強使用地理環境設計CAD工程圖時的用戶體驗…

Kubernetes 企業級高可用部署

目錄 1、Kubernetes高可用項目介紹 2、項目架構設計 2.1、項目主機信息 2.2、項目架構圖 2.3、項目實施思路 3、項目實施過程 3.1、系統初始化 3.2、配置部署keepalived服務 3.3、配置部署haproxy服務 3.4、配置部署Docker服務 3.5、部署kubelet kubeadm kubectl工具…

程序員你可長點心吧!代碼檢查你得用

代碼檢查的重要性不言而喻&#xff0c;很多重要的項目都要做代碼的檢查&#xff0c;及時糾正代碼中的錯誤&#xff0c;確保代碼的可讀性、可維護性和可拓展性&#xff0c;從而保證軟件的質量。 一、代碼檢查的定義 代碼檢查是指通過對程序代碼的獨立檢查來提高代碼質量和開發效…

論壇項目之用戶部分

注冊接口 實現思路 1.特殊字段檢查&#xff08;比如性別沒有給出需要給出默認值&#xff09; 2.對比檢查兩次輸入的密碼是否一致&#xff0c;不一致報錯 3.利用UUID生成隨機‘鹽’值&#xff0c;并使用密碼進行MD5加密后與‘鹽’進行拼接&#xff0c;生成加密后的密碼 4.創建U…

什么是P2P?

P2P (Peer-to-Peer) 是一種分布式的網絡架構&#xff0c;其中各個節點&#xff08;通常被稱為“peers”或“節點”&#xff09;直接進行數據共享和交換&#xff0c;而無需依賴中央服務器。P2P 網絡強調平等的參與和共享&#xff0c;每個節點既可以是數據的消費者&#xff08;下…

推進深度融合 打造智慧媒體

以下內容來自于易知微官網&#xff0c;點擊一下&#xff0c;即可進入官網了解詳情。 注意&#xff1a;案例數據均為虛擬數據 數字改革是一場波及經濟社會發展全局、涵蓋生產力到生產關系的全方位變革。在數字化時代&#xff0c;以數字改革賦能媒體深度融合已然成為時代所向、…

每日一題——連續子數組的最大和

題目 輸入一個長度為n的整型數組array&#xff0c;數組中的一個或連續多個整數組成一個子數組&#xff0c;子數組最小長度為1。求所有子數組的和的最大值。 數據范圍:1<n<2105 ?100<a[i]<100 要求:時間復雜度為 O(n)&#xff0c;空間復雜度為 O(n) 示例1 輸入…

ubuntu中安裝python

最簡單方便的是 apt 使用第三方的 ppa 源&#xff0c;然后直接 apt 安裝 python3.9 安裝 software-properties-common 獲取add-apt-repository命令&#xff1a;apt install -y software-properties-common添加第三方的 ppa 源&#xff1a;add-apt-repository ppa:deadsnakes/p…

Spring系列篇--關于Spring Bean完整的生命周期【附有流程圖,超級易懂】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下來看看由輝輝所寫的關于Spring的相關操作吧 目錄 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Spring Bean是單例模式還是多例模式 二…

Kafka如何保證消息?定能被消費

Kafka 通過多種機制來保證消息一定能被消費&#xff0c;從而實現數據的可靠性和持久性。 以下是一些常見的方法和策略來提高消息的可靠性&#xff1a; 復制機制&#xff1a; Kafka 使用了分區和副本的概念。每個分區可以有多個副本&#xff0c;分布在不同的 Broker 上。當消息…

k8s 自身原理 3

前面有分享到 master 主節點上的 四個組件&#xff0c;etcd&#xff0c;ApiServer&#xff0c;scheduler&#xff0c;controller manager 接下來我們分享一波 woker 節點上的組件&#xff0c;xdm 還記得 worker 節點上都有什么嗎&#xff1f; kubeletkube-proxy實際的服務對應…

【數據結構】棧和隊列常見題目

文章目錄 有效的括號用隊列實現棧兩個隊列實現棧一個隊列實現棧用棧實現隊列設計循環隊列最小棧棧的壓入&彈出序列逆波蘭表達式隊列:先進先出 棧:后進先出 有效的括號 https://leetcode.cn/problems/valid-parentheses/ class Solution {public:bool isValid(string s) {…

如何讓多線程步調一致?

前幾天老板突然匆匆忙忙的過來說對賬系統最近越來越慢了&#xff0c;能不能快速優化一下&#xff1f;我了解了對賬系統的業務后&#xff0c;發現還是挺簡單的&#xff0c;用戶通過在線商城下單&#xff0c;會生成電子訂單&#xff0c;保存在訂單庫。之后物流會生成派送單給用戶…

Redis - 數據類型映射底層結構

簡介 從數據類型上體現就是&#xff0c;同一個數據類型&#xff0c;在不同的情況下會使用不同的編碼類型&#xff0c;底層所使用的的數據結構也不相同。 字符串對象 字符串對象的編碼可以是 int、raw 和 embstr 三者之一。 embstr 編碼是專門用于保存簡短字符串的一種優化編…

每日一學——無線基礎知識

無線局域網&#xff08;Wireless Local Area Network&#xff0c;簡稱 WLAN&#xff09;是一種使用無線通信技術連接多個無線終端設備的局域網。它通常基于無線電波傳輸數據&#xff0c;并使用無線接入點&#xff08;Access Point&#xff0c;簡稱 AP&#xff09;來連接無線設備…

網絡安全--負載均衡

負載均衡 webshell實踐 一、負載均衡配置 1.在全局的http下寫下它&#xff1a; upstream nginx_boot{# 30s內檢查心跳發送兩次包&#xff0c;未回復就代表該機器宕機&#xff0c;請求分發權重比為1:2server 192.168.0.000:8080 weight100 max_fails2 fail_timeout30s; ser…

LeetCode150道面試經典題-- 合并兩個有序鏈表(簡單)

1.題目 將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 2.示例 示例 1&#xff1a; 輸入&#xff1a;l1 [1,2,4], l2 [1,3,4] 輸出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 輸入&#xff1a;l1 [], l2 [] 輸…

k8s 中快速啟動curl pod 做api test

場景 k8s上運行的pod需要進行api測試,由于開發使用的鏡像都是最小化構建,不能保證現有的pod中一定有curl工具,于是需要啟動一個帶有curl工具的測試pod專門進行api測試 指令 kubectl run curl-test-pod --imagecurlimages/curl -n {namespace} -i --tty -- sh上述指令實現在指…

“一日之際在于晨”,歡迎蒞臨WAVE SUMMIT上午場:Arm 虛擬硬件早餐交流會

8月16日&#xff0c;盛夏的北京將迎來第九屆WAVE SUMMIT深度學習開發者大會。在峰會主論壇正式開啟前&#xff0c;讓我們先用一份精美的元氣早餐&#xff0c;和一場“Arm虛擬硬件交流會”&#xff0c;喚醒各位開發小伙伴的開發魂&#xff01; 8月16日&#xff0c;WAVE SUMMIT大…

時序預測 | MATLAB實現WOA-CNN-LSTM鯨魚算法優化卷積長短期記憶神經網絡時間序列預測

時序預測 | MATLAB實現WOA-CNN-LSTM鯨魚算法優化卷積長短期記憶神經網絡時間序列預測 目錄 時序預測 | MATLAB實現WOA-CNN-LSTM鯨魚算法優化卷積長短期記憶神經網絡時間序列預測預測效果基本介紹模型描述程序設計學習總結參考資料 預測效果 基本介紹 時序預測 | MATLAB實現WOA-…