• 【NOIP普及组】2016模拟考试(10.29)——排座椅


    问题 B: 排座椅(seat.cpp)

    时间限制: 1 Sec  内存限制: 64 MB

    题目描述

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

    输入

    seat.in 第一行,有5各用空格隔开的整数,分别是M,N,K,L,D(2≤N,M≤1000,0≤K<M,0≤L<N,D≤2000)。 接下来D行,每行有4个用空格隔开的整数,第i行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。

    输出

    seat.out 共两行。 第一行包含K个整数,a1a2……aK,表示第a1行和a1+1行之间、第a2行和第a2+1行之间、…、第aK行和第aK+1行之间要开辟通道,其中ai<ai+1,每两个整数之间用空格隔开(行尾没有空格)。 第二行包含L个整数,b1b2……bk,表示第b1列和b1+1列之间、第b2列和第b2+1列之间、…、第bL列和第bL+1列之间要开辟通道,其中bi<bi+1,每两个整数之间用空格隔开(行尾没有空格)。

    样例输入

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

    样例输出

    2
    2 4

    提示

     

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

    #------------------------------------------------------------------------------#

    这个题,看上去很像图论,事实上是贪心……


    大体思路:

    输入xi,yi,pi,qi,只要xi和pi相等,就表示两个学生在同一排,则L[yi和qi中小的一个]++

    如果yi和qi相等,就表示两个学生在同一列,则K[xi和pi中小的一个]++,千万不要弄反了。


    为什么要小的一个++呢?

    仔细观察一下图(题目也有说)就知道了,输出的是ai与ai+1,如果存大的一个,通道就有问题了。


    存的时候用结构体更方便,里面还需有一个a变量,存安放的位置,初始化a[i]均为i。

    然后就是按K和L从大到小排序,注意还要再排一次a,因为题目说需从小到大输出!


    然后直接输出即可。


    代码:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int m,n,k,l,d;
    struct node
    {
    	int a,n;
    }x[1002],y[1002];//结构体
    bool _c(node x,node y)
    {
    	return x.n>y.n;//按n
    }//sort从大到小
    bool c_(node x,node y)
    {
    	return x.a<y.a;//按a
    }//sort从小到大
    int main()
    {
    	scanf("%d%d%d%d%d",&m,&n,&k,&l,&d);
    	for(int i=1;i<=max(m,n);i++)
    		x[i].a=y[i].a=i;//初始化
    	for(int i=1;i<=d;i++)
    	{
    		int _x,_y,_p,_q;
    		scanf("%d%d%d%d",&_x,&_y,&_p,&_q);
    		if(_y==_q) x[min(_x,_p)].n++;//在同一列
    		if(_x==_p) y[min(_y,_q)].n++;//在同一行
    	}
    	sort(x+1,x+n+1,_c); sort(y+1,y+n+1,_c); sort(x+1,x+k+1,c_); sort(y+1,y+l+1,c_);//四次排序
    	printf("%d",x[1].a);
    	for(int i=2;i<=k;i++)
    		printf(" %d",x[i].a);//输出
    	printf("
    %d",y[1].a);
    	for(int i=2;i<=l;i++)
    		printf(" %d",y[i].a);//一定要处理空格!!!我因为没处理行末空格wrong了1次
    	return 0;
    }


  • 相关阅读:
    node 使用 ssh2-sftp-client 实现 FTP 的文件上传和下载功能
    gulp 使用 gulp.spritesmith 组件生成雪碧图
    webpack4 打包多页面应用
    javascript 两个变量值的互换
    微信公众号爬坑(react)
    文件上传(H5 + node)
    前后端分离 ajax 跨域 session 传值 (后端使用 node)
    webpack dev 日记
    npm报错 端口被占用 events.js:167 throw er; // Unhandled 'error' event Error: listen EADDRINUSE 127.0.0.1:9999
    多个 img 之间存在间隔
  • 原文地址:https://www.cnblogs.com/LinqiongTaoist/p/7203756.html
Copyright © 2020-2023  润新知