南沙C++信奥赛陈老师解一本通题 1943:【08NOIP普及组】排座椅

 【题目描述】

上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的DD对同学上课时会交头接耳。同学们在教室中坐成了MM行NN列,坐在第ii行第jj列的同学的位置是(i,ji,j),为了方便同学们进出,在教室中设置了KK条横向的通道,LL条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。

请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。

【输入】

第一行,有55个用空格隔开的证书,分别是M,N,K,L,D(2≤N,M≤1000,0≤K<M,0≤L<N,D≤2000)M,N,K,L,D(2≤N,M≤1000,0≤K<M,0≤L<N,D≤2000)。

接下来DD行,每行有44个用空格隔开的整数。第ii行的44个证书Xi,Yi,Pi,OiXi,Yi,Pi,Oi,表示坐在位置(Xi,YiXi,Yi)与(Pi,OiPi,Oi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。

输入数据保证最优秀方案的唯一性。

【输出】

共两行。

第一行包含KK个整数,a1,a2……aka1,a2……ak,表示第a1a1行和a1+1a1+1行之间、第a2a2行和第a2+1a2+1行之间、…、第aKaK行和第aK+1aK+1行之间要开辟通道,其中ai<ai+1ai<ai+1,每两个整数之间用空格隔开(行尾没有空格)。

第二行包含LL个整数,b1b2……bLb1b2……bL,表示第b1b1列和b1+1b1+1列之间,第b2b2列和b2+1b2+1列之间、…、第bLbL列和第bL+1bL+1列之间要开辟通道,其中bi<bi+1bi<bi+1,每两个整数之间用空格隔开(行尾没有空格)。

【输入样例】

4 5 1 2 3 
4 2 4 3 
2 3 3 3 
2 5 2 4

【输出样例】

2
2 4

 

#include <bits/stdc++.h>
using namespace std;
struct Seat
{
	int cnt;
	int id;//代表行号或行号 
};
Seat row[2001],col[2001];
bool cmp(Seat a, Seat b)
{
	return a.cnt>b.cnt;
}
bool cmp2(Seat a, Seat b)
{
	return a.id<b.id;
}
int main()
{
	int m,n,k,l,d;
	cin>>m>>n>>k>>l>>d;
	for(int i=1;i<=d;i++)
	{
		int r1,c1,r2,c2;
		cin>>r1>>c1>>r2>>c2;	 
		if(c1==c2)	//如果列相等 则需要划分行 
		{
			row[min(r1,r2)].cnt++;	//只存行号最小
			row[min(r1,r2)].id=min(r1,r2); //用于划分行号 
		}
		else
		{
			col[min(c1,c2)].cnt++;
			col[min(c1,c2)].id=min(c1,c2); 
		}
	}
	sort(row+1,row+1+m,cmp);
	sort(col+1,col+1+n,cmp);
	
	sort(row+1,row+1+k,cmp2);	//要求按行号最小输出 不能全排序,否则不符合要求的ID会放到k内 
	sort(col+1,col+1+l,cmp2);
	for(int i=1;i<=k;i++)
		cout<<row[i].id<<" ";
	cout<<endl;
	for(int i=1;i<=l;i++)
		cout<<col[i].id<<" ";
	return 0;
}

 

posted @   南沙区信奥赛老师  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示