贪心算法(c++)

概念

题目

多机调度问题

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int n,m;
int a[1010],b[1010];

bool cmp(int,int);
int main()
{
	
	int kk;
	cin>>kk;
	while(kk--)
	{
		cin>>n>>m;
		for(int i = 1;i<=n;i++)
		{
			cin>>a[i];
		}
		sort(a+1,a+n+1,cmp);
		int sum = 0;
		b[1010] = {0};
		for(int i = 1;i<=n;i++)
		{
			int mi = 999999999,mii;
			for(int j = 1;j<=m;j++)
			{
				if(b[j]<mi) mi = b[j],mii = j;
			}
			b[mii] += a[i];
		}
		int ma = -999999999;
		for(int i = 1;i<=m;i++)
		{
			ma = max(ma,b[i]);
		}
		cout<<ma<<endl;
	}
	
	
	return 0;
}
bool cmp(int xx,int yy)
{
	return xx>yy;
}

排队打水问题

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int n,m;
int a[1010],b[1010];


int main()
{
	
	cin>>n>>m;
	for(int i = 1;i<=n;i++)
	{
		cin>>a[i];
	}
	sort(a+1,a+n+1);
	int sum = 0;
	for(int i = 1;i<=n;i++)
	{
		int mi = 999999999,mii;
		for(int j = 1;j<=m;j++)
		{
			if(b[j]<mi) mi = b[j],mii = j;
		}
		b[mii] += a[i];
		sum += b[mii];
	}
	cout<<sum;
	
	return 0;
}

找零钱问题

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int n;
int a[10] = {0,1000,500,200,100,50,20,10,5,1};
int cnt;


int main()
{
	float nn;
	cin>>nn;
	n = nn*10;
	for(int i = 1;i<10;i++)
	{
		int x = n/a[i];
		cnt += x;
		cout<<a[i]*1.0/10<<":"<<x<<endl;
		n = n%a[i];
	}
	cout<<cnt;
	
	return 0;
}

活动选择问题

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
struct node
{
	int x,y,v;
	node(){};
	node(int aa,int bb,int cc)
	{
		x = aa;
		y = bb;
		v = cc;
	}
};

int n;
node a[10010];
node b[10010];
int lb;
int cnt;

int main()
{
	
	cin>>n;
	for(int i = 1;i<=n;i++)
	{
		cin>>a[i].x>>a[i].y;
		a[i].v = i;
	}
	for(int i = 1;i<=n-1;i++)
	{
		for(int j = 1;j<=n-1-i;j++)
		{
			if(a[j].y>a[j+1].y)
			{
				swap(a[j],a[j+1]);
			}
		}
	}
	
	b[++lb] = {a[1].x,a[1].y,a[1].v};
	cnt = 1;
	for(int i = 2;i<=n;i++)
	{
		if(a[i].x>=b[lb].y)
		{
			b[++lb] = {a[i].x,a[i].y,a[i].v};
			cnt++;
		}
	}
	cout<<cnt<<endl;
	for(int i = 1;i<=lb;i++)
	{
		cout<<b[i].v<<" ";
	}
	return 0;
}

可分割背包问题

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int n,m;
float w[10010],v[10010];
float x[10010];


int main()
{
	
	int ttt;
	cin>>ttt;
	while(ttt--)
	{
		cin>>m>>n;
		for(int i = 1;i<=n;i++)
		{
			cin>>w[i]>>v[i];
			x[i] = v[i]/w[i];
		}
		for(int i = 1;i<=n-1;i++)
		{
			for(int j = 1;j<=n-1-i;j++)
			{
				if(x[j]<x[j+1])
				{
					swap(x[j],x[j+1]);
					swap(w[j],w[j+1]);
					swap(v[j],v[j+1]);
				}
			}
		}
		float sum = 0;
		for(int i = 1;i<=n;i++)
		{
			if(m==0) break;
			if(m>=w[i]) m -= w[i],sum += v[i];
			else
			{
				sum += x[i]*m;
				m = 0;
			}
		}
		cout<<fixed<<setprecision(2)<<sum<<endl;
	}
	
	
	return 0;
}
相关推荐
铭哥的编程日记1 小时前
贪心算法解决分糖果问题
算法·贪心算法
马猴烧酒.1 小时前
【JAVA算法|hot100】贪心算法类型题目详解笔记
java·开发语言·ide·笔记·算法·spring·贪心算法
vx-程序开发1 小时前
springboot具备推荐和预警机制的大学生兼职平台的设计与实现-计算机毕业设计源码17157
java·c++·spring boot·python·spring·django·php
tankeven2 小时前
HJ127 小红的双生串
c++·算法
阿阿阿阿里郎2 小时前
ROS2快速入门--C++基础
开发语言·c++·算法
free-elcmacom2 小时前
C++<x>new和delete
开发语言·c++·算法
ouliten2 小时前
[CUTLASS笔记2]host端工具类
c++·笔记·cuda·cutlass
程序喵大人2 小时前
map的[]运算符,这个看似方便的语法,藏着怎样的魔鬼?
开发语言·c++·map·运算符
美式请加冰2 小时前
前缀数组的介绍和使用
数据结构·c++·算法