2018-3-22
1.打水問題
問題描述
n個人要打水,有m個水龍頭,第i個人打水所需時間為ti,請安排乙個合理的方案使得所有人的等待時間之和盡量小。
輸入格式
第一行兩個正整數n m 接下來一行n個正整數ti。
n,m<=1000,ti<=1000
輸出格式
最小的等待時間之和。(不需要輸出具體的安排方案)
樣例輸入
7 3
3 6 1 4 2 5 7
樣例輸出
11提示
一種最佳打水方案是,將n個人按照ti從小到大的順序依次分配到m個龍頭打水。
例如樣例中,ti從小到大排序為1,2,3,4,5,6,7,將他們依次分配到3個龍頭,則去龍頭一打水的為1,4,7;去龍頭二打水的為2,5;去第三個龍頭打水的為3,6。
第乙個龍頭打水的人總等待時間 = 0 + 1 + (1 + 4) = 6
第二個龍頭打水的人總等待時間 = 0 + 2 = 2
第三個龍頭打水的人總等待時間 = 0 + 3 = 3
所以總的等待時間 = 6 + 2 + 3 = 11
問題還是比較好理解的,我們先對大家需要打水的時間進行排序,為了使大家打水的總的時間最少,我們應該使用時最短的人先打水,那麼前m個人已經占用了m個水龍頭,那麼第m+1個人一定在第1個水龍頭打水,第m+2個人一定在第2個水龍頭打水…第m+m個人一定在第m個水龍頭打水。有人可能會問為什麼呢?因為我們是按照用時排序的,那麼第乙個一定是先結束的,那麼第m+1個人自然就過來了,本身第m+1個人打水的時間就比較長,它來的還晚,那麼他一定是當前所有佔水龍頭中打水最慢的那乙個,那麼第二個水龍頭的打完了,第m+2個人過來了,它也是最慢的那乙個…
1 2 3 4 5 …m
1 2 3 4 5…m
m+1 m+2 m+3…m+m
… 那麼第一列的人等待的時間為t[0],t[0]+t[m-1],t[0]+t[m-1]+t[2*m-1]…
#include
#include
using
namespace
std;
const
int n = 1000;
int t[n+1];
int n,m,s;
void cal()
} }int main()
if (m==n)
sort(t,t+n);
s=0;
cal();
cout
0;}
這個問題我們只考慮了等待的時間。
2.排隊打水問題
問題描述
有n個人排隊到r個水龍頭去打水,他們裝滿水桶的時間t1、t2………..tn為整數且各不相等,應如何安排他們的打水順序才能使他們總共花費的時間最少?
輸入格式
第一行n,r (n<=500,r<=75)
第二行為n個人打水所用的時間ti (ti<=100);
輸出格式
最少的花費時間
樣例輸入
3 2
1 2 3
樣例輸出
7 資料規模和約定
其中80%的資料保證n<=10
由於沒有會員,完全不知道自己寫的對否。。。
我的理解是,使用的總時間為等待時間+排隊打水的時間,要使用的總時間最少,打水的時間本身就是乙個定值,那麼我們只要使等待時間最短就可以了啊,那麼我們只要在上一題的基礎上加上大家打水使用的時間的總和就可以了?!
#include
#include
using
namespace
std;
const
int n = 1000;
int t[n+1];
int n,m,s;
void cal()
} }int main()
sort(t,t+n);
s=0;
cal();
cout
0;}
藍橋杯 ADV 104演算法提高 打水問題
問題描述 n個人要打水,有m個水龍頭,第i個人打水所需時間為ti,請安排乙個合理的方案使得所有人的等待時間之和盡量小。輸入格式 第一行兩個正整數n m 接下來一行n個正整數ti。n,m 1000,ti 1000 輸出格式 最小的等待時間之和。不需要輸出具體的安排方案 樣例輸入 7 33 6 1 4 ...
藍橋杯 演算法提高 打水問題 邏輯策略 貪心
演算法提高 打水問題 時間限制 1.0s 記憶體限制 512.0mb 提交此題 問題描述 n個人要打水,有m個水龍頭,第i個人打水所需時間為ti,請安排乙個合理的方案使得所有人的等待時間之和盡量小。輸入格式 第一行兩個正整數n m 接下來一行n個正整數ti。n,m 1000,ti 1000 輸出格式...
藍橋杯 演算法提高 排隊打水問題
問題描述 有n個人排隊到r個水龍頭去打水,他們裝滿水桶的時間t1 t2 tn為整數 且各不相等,應如何安排他們的打水順序才能使他們總共花費的時間最少?輸入格式 第一行n,r n 500,r 75 第二行為n個人打水所用的時間ti ti 100 輸出格式 最少的花費時間 樣例輸入 3 21 2 3 樣...