n个人一起排队接水,第i个人需要b[i]的时间来接水。
1 <= n <= 1000
0 <= b[i] <= 1000
同时只能有一个人接水,正在接水的人和没有接水的人都需要等待。
完成接水的人会立刻消失,不会继续等待。
你可以决定所有人接水的顺序,并希望最小化所有人等待时间的总和。
收起
输入
第一行一个整数n 接下来n行,每行一个整数表示b[i]
输出
一行一个整数,表示所有人等待时间的总和的最小值
输入样例
3 1 2 3
输出样例
10
这是一个简单的贪心问题,先介绍一下贪心算法:
我了解的贪心算法是一种获得最优方案的思维或者办法吧,它在许多题目中有运用,而运用较多的应该是条件比较多,如何获得最优方案的问题,比如背包问题,在占空间与质量,甚至于价值等等方面选取最优的方案,依据目前我的接触来看,两种情况的较多,当然,它也有许多运用。例如Kruskal算法,一种用来查找最小生出树的算法,还有用于解决同样问题的prim算法和Boruvka算法,dijkstra算法等一般寻找最优方案的算法与贪心算法有关联,这种思想在做题中会深有体现。
附代码:
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int g[10000],h[10000];
int main() {
int a,b,c,d=0,e,f=1;
cin>>a;
for(b=1;b<=a;++b)
cin>>g[b];
sort(g+1,g+a+1);
while(a)
{
g[f]*=a;
d+=g[f];
f++;
a–;
}
cout<<d;
return 0;
}
非常简单,大体思路就是从小到大排序,假如有3个人,要等的时间分别是1,2,3,
那么第一个人接水的时间要三个人一起等,第二个人接水时间是两个人一起等,最后一个人接水时间就只有一个人等了
那么可以看出最前面的人接水时间最短,总共接水时间就越短,毕竟1*3+2*2+3*1<3*3+2*2+1*1,所以这是排序的根本目的,
当然这个只是涉及一个变量,比较容易,做这个题的目的就是寻找最优化的思路,一定要分清。