贪心算法----51nod排队接水

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,所以这是排序的根本目的,

当然这个只是涉及一个变量,比较容易,做这个题的目的就是寻找最优化的思路,一定要分清。

 

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/qq_43632924/article/details/86648651
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞