zoukankan      html  css  js  c++  java
  • 洛谷 1056——排座椅(简单的模拟)

    题目描述
    上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的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个整数,a1,a2……aK,表示第a1行和a1+1行之间、第a2行和a2+1行之间、…、第aK行和第aK+1行之间要开辟通道,其中ai< ai+1,每两个整数之间用空格隔开(行尾没有空格)。

    第二行包含L个整数,b1,b2……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对学生坐标时,为该行或该列的数组+1(即该行或列可以分割多少名学生)然后分别排序这些数值,最后从大到小累加,直到该行或该列不能分割为止


    type arr=array[1..1000]of longint;
    
    var  h,k1,k2,l,n,x1,x2,y1,y2,i,j:longint;
         a1,a2,x,b,a:arr;
    
    procedure qsort(k:longint);
    var i,j,t:longint;
    begin
      for i:=1 to k-1 do
        for j:=i+1 to k do
          if b[i]>b[j] then
            begin
              t:=b[i];
              b[i]:=b[j];
              b[j]:=t;
            end;
    end;
    
    procedure sort(n:longint);
    var
      i,j,t:longint;
    begin
      for i:=1 to n-1 do
        for j:=i+1 to n do
          if (a[i]<a[j]) then
            begin
              t:=a[i]; a[i]:=a[j]; a[j]:=t;
              t:=b[i]; b[i]:=b[j]; b[j]:=t;
            end;
    end;
    
    begin
      read(h,l,k1,k2,n);
      for i:=1 to n do
        begin
          readln(x1,y1,x2,y2);
          if x1=x2 then
            begin
              if y1>y2 then inc(a1[y2]);
              if y1<y2 then inc(a1[y1]);
            end;
          if y1=y2 then
            begin
              if x1>x2 then inc(a2[x2]);
              if x1<x2 then inc(a2[x1]);
            end;
        end;
      for i:=1 to l do x[i]:=i;
      a:=a2; b:=x; sort(l); qsort(k1); for i:=1 to k1 do write(b[i],' ');
      for i:=1 to h do x[i]:=i;
      writeln;
      a:=a1; b:=x; sort(h); qsort(k2); for i:=1 to k2 do write(b[i],' ');
    end.
  • 相关阅读:
    linux 解压tgz 文件指令
    shell 脚本没有执行权限 报错 bash: ./myshell.sh: Permission denied
    linux 启动solr 报错 Your Max Processes Limit is currently 31202. It should be set to 65000 to avoid operational disruption.
    远程查询批量导入数据
    修改 MZTreeView 赋权节点父节点选中子节点自动选中的问题
    关于乱码的问题解决记录
    我的网站优化之路
    对设计及重构的一点反思
    我的五年岁月
    奔三的路上
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412435.html
Copyright © 2011-2022 走看看