贪心算法(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;
}
相关推荐
L_090717 小时前
【C++】异常
开发语言·c++
liulilittle17 小时前
关于拥塞控制的几点思考
网络·c++·tcp/ip·计算机网络·信息与通信·tcp·通信
QT-Neal20 小时前
C++ 编码规范
c++
啦啦啦啦啦zzzz20 小时前
数据结构:红黑树理论
数据结构·c++·红黑树
Yolo_TvT20 小时前
C++:默认构造函数
c++
小欣加油1 天前
leetcode994 腐烂的橘子
数据结构·c++·算法·leetcode·bfs
.千余1 天前
【C++】手写双向链表:list容器模拟实现
开发语言·c++·笔记·学习·其他
liulilittle1 天前
过冲:拥塞控制的呼吸与盲行
linux·网络·c++·tcp/ip·计算机网络·tcp·通信
小欣加油1 天前
leetcode2574 左右元素和的差值
数据结构·c++·算法·leetcode·职场和发展
weixin_461769401 天前
通过数组和队列构造二叉树方法(用于算法测试),C++ vector不能直接使用null
数据结构·c++·算法·vector·nullptr·null