贪心算法应用例题

最优装载问题

#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;
}
相关推荐
დ旧言~24 分钟前
【高阶数据结构】图论
算法·深度优先·广度优先·宽度优先·推荐算法
张彦峰ZYF29 分钟前
投资策略规划最优决策分析
分布式·算法·金融
The_Ticker44 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
Dola_Pan1 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
繁依Fanyi2 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse
烦躁的大鼻嘎2 小时前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
C++忠实粉丝2 小时前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
用户37791362947553 小时前
【循环神经网络】只会Python,也能让AI写出周杰伦风格的歌词
人工智能·算法
福大大架构师每日一题3 小时前
文心一言 VS 讯飞星火 VS chatgpt (396)-- 算法导论25.2 1题
算法·文心一言