1. 程式人生 > >算法提高--接水問題

算法提高--接水問題

一行 sort names 計算方法 highlight 個數 pre space color

問題描述
  有n個人排隊到r個水龍頭去打水,他們裝滿水桶的時間t1、t2………..tn為整數且各不相等,應如何安排他們的打水順序才能使他們總共花費的時間最少?
輸入格式
  第一行n,r (n<=500,r<=75)
  第二行為n個人打水所用的時間Ti (Ti<=100);
輸出格式
  最少的花費時間
樣例輸入
3 2
1 2 3
樣例輸出
7

數據規模和約定
  其中80%的數據保證n<=10

這個問題的難度不在於貪心選擇,肯定都是要時間越短的越靠前接水

因為他們的接水時間是固定的,必須要他們的等待時間最短才能保證總時間是最短的

這個問題難點在於怎麽計算總時間

計算方法是,另找一個數組,把本題的人的總時間存儲起來

前r 個排隊時間是0,直接存本身,後面的是自己的排隊時間加上自己的時間,

其實排序完成後,時間已經是固定的了。

#include <iostream>
#include <algorithm>
using namespace std;
int a[1000];
int b[1000];

int main()
{
	int n;
	int r;
	int sum=0;
	cin>>n;
	cin>>r;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	sort(a,a+n);

	for(int j=0;j<r;j++)
	{
		b[j]=a[j];
	}
    for(int i=r;i<n;i++)
    {
    	b[i]=b[i-r]+a[i];
	}
	
	for(int x=0;x<n;x++)
	{
		sum=sum+b[x];
	}
	cout<<sum;
	return 0;
}

  

算法提高--接水問題