当前位置:首页 > 复赛 > 正文内容

NOIP2008年普及组 T2 排座椅

亿万年的星光5年前 (2021-01-28)复赛1455

【问题描述】

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

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

【输入描述】

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

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

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

【输出描述】

共两行。

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

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

【样例输入1】

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

【样例输出1】

2
2 4

【样例解释】



上图中用符号*、※,+标出了3对会交头接耳的学生的位置,图中3条粗线的位置表示通道,图示的通道划分方案是唯一的最佳方案。


【题目分析】

1.先判断两个交头接耳的人中间的过道是横向还是纵向
2.要使方案最优,使用桶排序,记录两个交头接耳的人中需要设置哪条通道,被需要最多的通道一定要设置 
3.遍历桶排序中的所有值,找出最大值,把最大值的数值设为-1
4.输出数组中值为-1的下标 


【参考代码】


#include<bits/stdc++.h>
using namespace std;
int a[1005],b[1005];//创建数组 
int main()
{
	int m,n,k,l,d,x,y,p,q,max=-1,t;
	cin>>m>>n>>k>>l>>d;
	for(int i=1;i<=d;i++)
	{
		cin>>x>>y>>p>>q;
		if(abs(x-p)==1)
		{
			a[min(x,p)]++;//横向 
		} 
		if(abs(y-q)==1)
		{
			b[min(y,q)]++;//纵向 
		}
	} 
	for(int i=1;i<=k;i++)
	{
		max=-1;
		for(int j=1;j<=1000;j++)
		{
			if(a[j]>max)
			{
				max=a[j];//记录能分开多少对交头接耳的学生的最大值 
				t=j;//记录下标 
			}
		}
		a[t]=-1;//最多能分开的交头接耳的学生 
	}//横向 
	for(int i=1;i<=l;i++)
	{
		max=-1;
		for(int j=1;j<=1000;j++)
		{
			if(b[j]>max)
			{
				max=b[j];//记录能分开多少对交头接耳的学生的最大值 
				t=j;//记录下标 
			}
		}
		b[t]=-1;//最多能分开的交头接耳的学生 
	}//纵向 
	for(int i=1;i<=1000;i++)
	{
		if(a[i]==-1)
		{
			cout<<i<<" ";//输出横向的过道 
		}
	}
	cout<<endl;
	for(int i=1;i<=1000;i++)
	{
		if(b[i]==-1)
		{
			cout<<i<<" ";//输出纵向的过道 
		}
	}
	return 0;	
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

NOIP2016年普及组 T2 回文日期

【题目描述】日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。牛牛习惯用8位数字表示一个日期,其中,前4位代表年份,接下来2位代表月份,最后2位代表日期。显然:一个日期只有一种表示方法...

NOIP2003年普及组 T1 乒乓球

【题目描述】国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退...

NOIP2014年普及组T1 珠心算测验

【题目描述】珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。某学校的珠心算老师采用一种快速考察珠心算加...

CSP-J2021年普及组复赛T1——分糖果

【题目背景】红太阳幼儿园的小朋友们开始分糖果啦!【题目描述】红太阳幼儿园有 n 个小朋友,你是其中之一。保证 n ≥ 2。 有一天你在幼儿园的后花园里发现无穷多颗糖果,你打算拿一些糖果回去分...

NOIP2011年普及组T2 统计单词数

【题目描述】一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给...

NOIP2013年普及组T2 表达式求值

【题目描述】给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。【输入描述】输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“∗”,且没有括号,所有参与运...