贪心算法(蓝桥杯 C++ 题目 代表 注解)

介绍:

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,从而希望最终能够得到全局最好或最优的结果的算法。它通常用来解决一些最优化问题,如最小生成树、最短路径等。

贪心算法的核心思想是每次都选择局部最优解,而不考虑全局的情况。通过不断地做出局部最优选择,整体上就能得到一个接近最优解的解。

然而,贪心算法并不是在所有情况下都能得到最优解。由于贪心算法只考虑当前的最优选择,而不进行回溯,可能会导致最终结果并非全局最优解。因此,在使用贪心算法时,需要确保问题具备贪心选择性质(即局部最优解能够导致全局最优解)以及最优子结构性质(即问题的最优解包含了其子问题的最优解)。

在应用贪心算法时,可以采用贪心选择、最优子结构和证明最优性三个步骤来设计算法。首先,通过贪心选择找到局部最优解;然后,通过证明最优性来证明贪心选择是安全的;最后,通过最优子结构来将问题分解为子问题,并迭代地求解子问题。

总之,贪心算法是一种简单而有效的算法,可以在一些满足贪心选择性质和最优子结构性质的问题上得到最优解。然而,在应用贪心算法时需要注意验证问题的性质,以确保得到正确的结果。

题目一(找零问题):

​​

代码:

cpp 复制代码
#include<iostream>
using namespace std;
int main()
{
    int n, i = 1;
    cin >> n;
    int a[6] = { 0,100,50,20,5,1 };
    int cnt[6] = { 0 };
        while (n)
        {
            cnt[i] = n / a[i];
            n -= cnt[i] * a[i];
            i++;
        }
    for (int i = 1; i <= 5; i++)
        cout << a[i] << ":" << cnt[i] << endl;
}

题目二(分糖果):

代码:

cpp 复制代码
#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	int a[105];
	int ans = 0;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	while (1)
	{
		int temp = a[1] / 2;//记录第一个孩子的一半,要给最后一个孩子的
		for (int i = 1; i < n; i++)
		{
			a[i] = a[i] / 2 + a[i + 1] / 2;//依次传递
		}
		a[n] = a[n] / 2 + temp;//最后一个的为自身一半加上第一个孩子的一半
		int flag = 1;//记录是否都相同
		for (int i = 1; i <= n; i++)
		{
			if (a[i] != a[1])
			{
				flag = 0;//标记为不同
			}
			if (a[i] % 2 == 1)//为基数补一个
			{
				a[i] += 1;
				ans++;//记录加上补了一个
			}
		}
		if (flag == 1)//都相同跳出
			break;
	}
	cout << ans;
}

题目三(翻硬币):

代码:

cpp 复制代码
#include<iostream>
using namespace std;
string s, x;
int cnt=0;
void swaps(int k)
{
	if (s[k] == '*')
		s[k] = 'o';
	else
		s[k] = '*';
}
int main()
{
	cin >> s >> x;
	for (int i = 0; i < s.size(); i++)
	{
		if (s[i] != x[i])
		{
			swaps(i);
			swaps(i + 1);
			cnt++;
		}
	}
	cout << cnt << endl;
}

题目四(答疑):

代码:

cpp 复制代码
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
    int s, a, e;
    long long sum;
};
bool cmp(node a, node b)//根据时间总和
{
    return a.sum < b.sum;
}
int main()
{
    int n;
    cin >> n;
    node student[1005];
    for (int i = 1; i <= n; i++)
    {
        cin >> student[i].s >> student[i].a >> student[i].e;
        student[i].sum = student[i].s + student[i].a + student[i].e;
    }
    sort(student + 1, student + n + 1, cmp);//排序,从小到大
    long long time = student[1].s + student[1].a;//第一个学生此时发
    long long ans = time;
    for (int i = 2; i <= n; i++)
    {
        time += student[i].s + student[i].a + student[i - 1].e;//这一个学生发的时间在上一个学生发的时间上再加上上一个学生离开的时间加上该生进入和询问的时间
        ans += time;
    }
    cout << ans;
}
相关推荐
ajassi20002 小时前
开源 C++ QT Widget 开发(十五)多媒体--音频播放
linux·c++·qt·开源
鹅毛在路上了5 小时前
C++, ffmpeg, libavcodec-RTSP拉流,opencv实时预览
c++·opencv·ffmpeg
John_ToDebug5 小时前
定制 ResourceBundle 的实现与 DuiLib 思想在 Chromium 架构下的应用解析
c++·chrome·ui
小欣加油6 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展
王璐WL6 小时前
【c++】c++第一课:命名空间
数据结构·c++·算法
aramae6 小时前
C++ -- 模板
开发语言·c++·笔记·其他
MChine慕青8 小时前
顺序表与单链表:核心原理与实战应用
linux·c语言·开发语言·数据结构·c++·算法·链表
骄傲的心别枯萎10 小时前
RV1126 NO.16:通过多线程同时获取H264和H265码流
linux·c++·音视频·rv1126
落羽的落羽10 小时前
【C++】特别的程序错误处理方式——异常机制
开发语言·c++
空山新雨(大队长)10 小时前
C 语言第一课:hello word c
c++·c·exe