蓝桥杯备考:贪心算法之排座椅

这道题的贪心策略就是每次都选能阻碍最多的横线或者纵线,我们可以把每个位置和阻隔学生数量绑定在一起,可能会想到哈希表或者数组,但是我们还要根据阻隔学生数量进行排序,so我们得开个结构体,然后写个cmp来规定排序才好,最后再把排好序的,如果阻隔数量相等的,按位置从小到大排序,也就是说我们需要排两次序

好的,我们来写一下代码吧

cpp 复制代码
#include <iostream>
#include <algorithm>
const int N = 1010;

using namespace std;

int n,m,k,l,d;

struct node{
	int x;
	int cnt;
}col[N],row[N];
bool cmp1(const node& p1,const node& p2)
{
	return p1.cnt>p2.cnt;
}
bool cmp2(const node &p1,const node& p2)
{
	return p1.x < p2.x;
}
int main()
{
	cin >> n >> m >> k >> l >> d;
	for(int i = 1;i<=m;i++)
	{
		col[i].x = i;
	}
	for(int i = 1;i<=n;i++)
	{
		row[i].x = i;
	}
	while(d--)
	{
		int x1,y1,x2,y2;
		cin >> x1 >> y1 >> x2 >> y2;
		if(x1==x2) col[min(y1,y2)].cnt++;
		else if(y1==y2) row[min(x1,x2)].cnt++;
	}
	sort(col+1,col+1+m,cmp1);
	
	sort(row+1,row+1+n,cmp1);
	
	sort(col+1,col+1+l,cmp2);
	sort(row+1,row+1+k,cmp2);
	
	for(int i = 1;i<=k;i++)
	{
		cout << row[i].x << " ";
		
	}
	cout << endl;

	for(int i = 1;i<=l;i++)
	{
		cout << col[i].x << " ";
		
	}
	cout << endl;

	
	return 0;
}
相关推荐
冬夜戏雪23 分钟前
单词拆分/分割等和子集
算法·leetcode·职场和发展
zheshiyangyang34 分钟前
前端面试基础知识整理【Day-6】
前端·面试·职场和发展
追随者永远是胜利者37 分钟前
(LeetCode-Hot100)72. 编辑距离
java·算法·leetcode·职场和发展·go
_OP_CHEN44 分钟前
【算法提高篇】(四)线段树之多个区间操作:懒标记优先级博弈与实战突破
算法·蓝桥杯·线段树·c/c++·区间查询·acm、icpc·区间操作
小范自学编程1 小时前
算法训练营 Day31 - 贪心算法 Part05
算法·贪心算法
jimy11 小时前
撇除猪肉腥味调料
职场和发展·程序员创富
锅包一切1 小时前
【蓝桥杯JavaScript基础入门】二、JavaScript关键特性
开发语言·前端·javascript·学习·蓝桥杯
追随者永远是胜利者11 小时前
(LeetCode-Hot100)20. 有效的括号
java·算法·leetcode·职场和发展·go
羑悻的小杀马特15 小时前
【动态规划篇】欣赏概率论与镜像法融合下,别出心裁探索解答括号序列问题
c++·算法·蓝桥杯·动态规划·镜像·洛谷·空隙法
重生之后端学习16 小时前
236. 二叉树的最近公共祖先
java·数据结构·算法·职场和发展·深度优先