贪心算法的自我理解与学习

目录

基本概念

贪心问题的一般步骤

例题

总结


基本概念

贪心算法采用贪心的策略,保证每次操作都是局部最优解,从而使最后得到的结果是全局最优。

贪心问题的一般步骤

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;   //好习惯
}

总结

本蒟蒻是代码新人,还在学习,备战蓝桥杯,感觉贪心算法还是挺简单的,在洛谷上刷题,脑子要炸了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值