【51NOD—贪心算法专题】 B 排队接水

https://www.51nod.com/contest/Problem.html#!problemId=2133&contestId=54

排队接水

基准时间限制:1 秒 空间限制:131072 KB 分值: 5

n个人一起排队接水,第i个人需要b[i]的时间来接水。

1 <= n <= 1000

0 <= b[i] <= 1000

同时只能有一个人接水,正在接水的人没有接水的人都需要等待。

完成接水的人会立刻消失,不会继续等待。

你可以决定所有人接水的顺序,并希望最小化所有人等待时间的总和。

Input

第一行一个整数n
接下来n行,每行一个整数表示b[i]

Output

一行一个整数,表示所有人等待时间的总和的最小值

Input示例

3
1
2
3

Output示例

10

思路1

倒数第i个人,对总时间造成的贡献是:i*b; 因为他自己要等b[i],其他n-i-1个人也要等b[i]

为使得总时间越小,应当把b大的放在后面;把b小的放在前面;

所以要对数组b进行排序;

#include <iostream>
#include <cstdio> 
#include<algorithm>
using namespace std;
int a[1010];
int main(int argc, char** argv) {
	int n;
	int sum=0;
	while(cin>>n){
		for(int i=0;i<n;i++){
			cin>>a[i];
		}
		sort(a,a+n);//从小到大排序
		for(int i=0;i<n;i++){
			sum+=(n-i)*a[i];//倒数第n个人,对时间的贡献 
		} //(自己要等a[i],其他n-i-1个人也要等a[i]
		cout<<sum<<endl;
	
	} 
	return 0;
}

 

猜你喜欢

转载自blog.csdn.net/qian2213762498/article/details/81743609