贪心算法应用例题

最优装载问题

复制代码
#include <stdio.h>
#include <algorithm>//排序

int main()
{
	int data[] = { 8,20,5,80,3,420,14,330,70 };//物体重量
	int max = 500;//船容最大总重量

	int count = sizeof(data) / sizeof(data[0]);//物体数量
	std::sort(data, data + count);//排序,排完数组中的数据从小到大排列
	int tmp = 0;//记总重量加和
	int n = 0;//记物体总件数
	for (int i = 0; i < count; i++)//从小到大,从轻到重挨个放进去
	{
		tmp += data[i];
		if (tmp > max)
		{
			break;
		}
		n++;
	}
		printf("%d\n", n);
		return 0;

}
复制代码
#include <stdio.h>
//给的数字是否能种下
bool canPlaceFlowers(int* data, int datasize, int n)//数组。数组长度,给的数字
{
	int i=0;//数组下标从0开始

	if (n == 0)//一朵不种
	{
		return true;//能
	}

	int count = 0;
	while (i < datasize)//在种地(数组)的长度里面
	{
		if (data[i] == 1)//当前有花1
		{
			i += 2;//空1再种01
		}
		else if (i > 0 && data[i - 1] == 1)//左边有花,当前没花0
		{
			i += 1;//1
		}
		else if (i + 1 < datasize && data[i + 1] == 1)//右边有花,当前没花0
		{
			i += 3;//101
		}
		else
		{
			//data[i]=1;种花,可不种,本题只要求数数字
			count++;//可种花空地+1
			i += 2;//空1再种01,类似if1

			if (count == n)//一等于就能,可大于
			{
				return true;
			}
		}
	}//条件都过一遍,i+到相应位置,符合while再进,不符若count<n就错
	return false;

}

int main()
{
	int data[] = { 1,0,0,0,1,0,0,0,0,0,0,1 };//顺序种逆序种最大count都是3
	if (canPlaceFlowers(data, sizeof(data) / sizeof(data[0]), 3))
	{
		printf("可以!\n");//return true;
	}
	else
	{
		printf("不可以!\n");
	}
	return 0;
}

例如:

输出【5,10】

相邻距离近的先发生碰撞

输出为空,全爆炸完了

输出【10】

复制代码
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

//碰撞爆炸函数
int* collision(int* data, int dataSize, int* retSize)//行星数组,数组大小(行星个数),碰炸后输出的数组
{
	int n = 0;//记录爆炸的个数
	while (1)//
	{
		int pre = 0;//左边行星下标
		int next = 1;//右边行星下标

		while (next < dataSize)//在数组内
		{
			if (data[pre] * data[next] < 0)//左右行星异号,方向相反
			{
				if (data[pre] < 0)//左边行星向左,则右向右,左右远离
				{
					//pre++;这样会有bug,pre可能走到爆炸过的0位置
					//next++;
					//移到下一个比较位置
					pre = next;//跳过中间可能有的0
					next++;
					continue;//跳出重进while (next < dataSize)
				}
				//左右相接近,3种爆炸情况,左没(变0),右没,左右都没
				if (abs(data[pre]) > abs(data[next]))//左绝对值大于右,abs求绝对值头函数math.h
				{
					data[next] = 0;//右炸没变0
					n++;
				}
				else if (abs(data[pre]) < abs(data[next]))
				{
					data[pre] = 0;
					n++;
				}
				else//相等
				{
					data[pre] = 0;
					data[next] = 0;
					n += 2;
				}
				break;//出if (data[pre] * data[next] < 0)
			}

			//爆炸完出现0后的位置移动,3种
			if (data[pre] == 0)
			{
				pre = next;
				next++;
			}
			else if (data[next] == 0)//[next==0]--[10,2]
			{
				next++;
			}
			else
			{
				pre = next;
				next++;
			}
		}

		if (next >= dataSize)//出数组,出while 
		{
			break;
		}
	}
	*retSize = dataSize - n;//输出数组大小
	int* retArray = (int*)malloc(*retSize * sizeof(int));//动态申请数组
	for (int i = 0, k = 0; i < dataSize; i++)//遍历原数组
	{
		if (data[i]!=0)//data[i]不为0,为真,也可if (data[i])
		{
			retArray[k++] = data[i];//数组不为0粘贴
		}
	}
	return retArray;
}

int main()
{
	int data[] = { 10,2,-5 };
	int size;
	int *ret = collision(data, 3, &size);
	for (int i = 0; i < size; i++)
	{
		printf("%d", ret[i]);
	}
	return 0;
}
相关推荐
How_doyou_do1 分钟前
树状数组底层逻辑探讨 / 模版代码-P3374-P3368
数据结构·算法·树状数组
小鹿鹿啊21 分钟前
C语言编程--14.电话号码的字母组合
c语言·开发语言·算法
小O的算法实验室1 小时前
2024年ESWA SCI1区TOP:量子计算蜣螂算法QHDBO,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
C语言魔术师1 小时前
509. 斐波那契数
算法·动态规划
Wendy_robot1 小时前
【前缀和计算和+哈希表查找次数】Leetcode 560. 和为 K 的子数组
c++·算法·leetcode
o独酌o1 小时前
算法习题-力扣446周赛题解
算法·leetcode
一只鱼^_1 小时前
第十六届蓝桥杯大赛软件赛省赛 C/C++ 大学B组 [京津冀]
c语言·数据结构·c++·算法·贪心算法·蓝桥杯·动态规划
云格~2 小时前
Leetcode:1. 两数之和
数据结构·算法·leetcode
几点才到啊2 小时前
C语言实现冒泡排序:算法原理与代码解析
c语言·算法·排序算法