目录
基本概念
贪心算法采用贪心的策略,保证每次操作都是局部最优解,从而使最后得到的结果是全局最优。
贪心问题的一般步骤
1.建立数学模型来描述问题
2.把求解的问题分成若干个子问题
3.对每一子问题求解,得到子问题的局部最优解
4.把子问题的局部最优解合成原来问题的一个解
例题
洛谷P1223 排队接水
题目:
## 题目描述
有 n 个人在一个水龙头前排队接水,假如每个人接水的时间为 Ti,请编程找出这 n个人排队的一种顺序,使得 n 个人的平均等待时间最小。
## 输入格式
第一行为一个整数 n。
第二行 n 个整数,第 i 个整数 Ti 表示第 i 个人的接水时间 Ti。
## 输出格式
输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
## 样例 #1
### 样例输入 #1
---------------------------------------------------
10
56 12 1 99 1000 234 33 55 99 812---------------------------------------------------
### 样例输出 #1
---------------------------------------------------
3 2 7 8 1 4 9 6 10 5
291.90---------------------------------------------------
题解:
平均等待的时间最短。
想要平均最短,首先就要每个人等待时间最短(局部最优解),然后平均最短(全局最优解)。
首先到要对 n 个数首先进行排序,若要输出排序后的顺序,就用结构体数组。
代码:
#include<iostream>
#include<algorithm> //sort排序函数的头文件
#include<iomanip> //保留几位小数的头文件
using namespace std;
//创建结构体
struct My
{
int a, num; //a为等待时间,num为编号
};
//顺序排序
bool cmp(My x, My y)
{
return x.a < y.a;
}
My arr[1001]; //结构体数组
int main()
{
int n;
double t = 0; //等待时间累加
cin >> n;
//输入等待时间,从1开始,方便输出编号
for (int i = 1; i <= n; i++)
{
cin >> arr[i].a;
arr[i].num = i;
}
//排序
sort(arr + 1, arr + 1 + n, cmp);
//输出排序后的编号
for (int i = 1; i <= n; i++) {
cout << arr[i].num << " ";
}
cout << endl; //换行
//算总等待时间
for (int j = n - 1; j >= 1; j--) //等待人数的计数器,由n-1开始
{
int i = n - j; //这是个规律,当前最少时间的人序号和要等待的人数之和 = n
t += arr[i].a * j; //累加
}
//输入保留2为小数
cout << fixed << setprecision(2) << t / n; // t/n 算平均
return 0; //好习惯
}
总结
本蒟蒻是代码新人,还在学习,备战蓝桥杯,
感觉贪心算法还是挺简单的,在洛谷上刷题,脑子要炸了。