1. 程式人生 > >演算法訓練 接水問題(模擬simulation)

演算法訓練 接水問題(模擬simulation)

這裡寫圖片描述

思路:
1)現將題目通讀一下:給你n個人,m個水龍頭。這裡所有人都是按順序打水的,每人打水所需的時間都是限定好的(嘿嘿,這裡可能是有些人的水壺有大號的和小號的),當打水的人中有人打好後,立即有人替補且沒有時間差!讓我們求所需的總時間!

2)下面分幾個步驟去求總時間!!
第一:如何模擬使用水龍頭打水的人的情況?(程式碼中用Min函式實現的) 因為每秒供水量為1,我們是可以想象用迴圈去不斷的減一,直到某些人打完水(單元的值為0,0就表示已經打完水了)改進一下:我們可以直接找到正在打水的人中所需最少的時間,假定為temp,讓正在使用水龍頭打水的人都減去temp,這樣就直接找到打完水的人了(單元值為0)。
第二:如何模擬替代(程式碼中用Replace函式實現):一開始打算通過陣列單元的覆蓋實現的,也就是當某人打完了我通過不斷的移位來實現替代,但是想了想,如果同時出現多個人打好水那不是麻煩了嘛!還是通過迴圈遍歷前面m(這裡預設前m個人在使用水龍頭)個單元的陣列看哪些為0的,(設定一個int型別的變數Re用來標記待打水的人所在單元的下標,這裡每替換一個Re都有自增)將待排序的人的值賦值到前面為0的單元,實現替換。
第三:當後面全部都替換完了之後,還剩最後一批正在使用水龍頭的人。最後應該加上他們當中所需時間最長的(用Max函式獲得)!!

這裡寫圖片描述

#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
int Array1[10001];//打水的總人數
int Time=0;//總時間,初始化為0       
int Re=0;//替補人所在下標(這裡替補人也是按照順序的)
/*找出陣列的最小值*/ 
void Min(int *Array,int
n) {//陣列的Array中前n個單元中找到最小單元的下標 int temp=10000;//記錄最小的值,初始值的時候,因為是找最小值,應該設大一點 for (int i = 0; i < n; i++) { if (Array[i]<temp) { temp = Array[i]; } } /*將正在打水的人的所需時間都減去最小的時間,打完的人(所需時間的值為0也就是Array[i]==0)進行替補*/ for (int i = 0; i < n; i++) { Array[i] -= temp; } Time += temp;//中時間加上減去的時間,最後要的是總時間
} /*替補函式(當水用完了時直接用後面的替補前面的)*/ void Replay(int *Array, int n) { //int temp = Min(Array, n); for (int i = 0; i < n; i++) { if (Array[i]==0) { Array[i] = Array[Re++];//如果為0表示後面的人可以替補了,Re此時++ Array[Re - 1] = 0;//表示此人已經替補上去了 } } } /*判斷是否結束*/ bool End(int *Array,int n) { for (int i = 0; i < n; i++) { if (Array[i]!=0) { return 0;//0為不為空 } } return 1;//返回1表示為空 } /*找出陣列中的最大值*/ int Max(int *Array, int n) {//陣列的Array中前n個單元中找到最小單元的下標 int temp = 0;//記錄最小的值,初始值的時候,因為是找最小值,應該設大一點 for (int i = 0; i < n; i++) { if (Array[i]>temp) { temp = Array[i]; } } return temp; } int main(){ int n, m;//總人數和水龍頭數 cin >> n >> m; for (int i = 0; i < n;i++) { cin >> Array1[i]; } Re = m;//替代的是所在的單元是m水龍頭最後一個的下一個單元 while (Array1[n-1]!=0 && (!End(Array1,m))) { Min(Array1, m); Replay(Array1, m); } //當最後一個也替補上去後,也就是說就剩下正在用水龍頭的人了,這時總時間應該是加上其中用時最長的!! cout << Time+ Max(Array1, n) << endl; return 0; }