• noip200802排座椅


    排座椅
    难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
    试题描述

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

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

     

     

    输入

    输入的第一行,有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)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。
    输入数据保证最优方案的唯一性。

     

    输出

    输出共两行。
    第一行包含K个整数,a1a2……aK,表示第a1行和a1+1行之间、第a2行和第a2+1行之间、…、第aK行和第aK+1行之间要开辟通道,其中ai< ai+1,每两个整数之间用空格隔开(行尾没有空格)。
    第二行包含L个整数,b1b2……bL,表示第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
    

      

    此题为noip2008普及组第二题

    说实话 这题放在普及组第二题确实难了点!

    本题大体思路:首先记录下每一行有多少个说话的。可以先考虑横着的,如果只让画一条线,肯定画人最多的那行,如果让画两条,就画人最多 和 次多的两行,这样才能使上课说话的人数最少,达到最优方案,纵向的方法类似。如果在哪里画下了通道,设个标记,最后输出。简称贪心法。

     1 #include<iostream>
     2 using namespace std;
     3 int b[1005],c[1005],m,n,K,L,D,X,Y,x,y,t=0,mm=0,i;
     4 int main()
     5 {
     6     cin>>m>>n>>K>>L>>D;
     7     for(i=0;i<D;i++)
     8     {
     9         cin>>X>>Y>>x>>y;//K x,L,y
    10         if(X==x)
    11         {
    12             if(Y>y) c[y]++;
    13             else c[Y]++;
    14         }
    15         if(Y==y)
    16         {
    17             if(X>x) b[x]++;
    18             else b[X]++;
    19         }//记录每行和每列有几个说话的
    20     }
    21     t=0;
    22     while(t<L)
    23     {
    24         mm=0;
    25         for(i=1;i<=n;i++)
    26         {
    27             if(c[i]>c[mm])
    28             {
    29                 mm=i;//寻找说话最多的
    30             }
    31         }
    32         t++;
    33         c[mm]=-1;//划通道,做标记
    34     }
    35     t=0;
    36     while(t<K)
    37     {
    38         mm=0;
    39         for(i=1;i<=n;i++)
    40         {
    41             if(b[i]>b[mm])
    42             {
    43                 mm=i;
    44             }
    45         }
    46         t++;
    47         b[mm]=-1;
    48     }
    49     int f=0;//输出
    50     for(i=1;i<=m;i++)
    51     {
    52         if(b[i]==-1)
    53         {
    54             if(f) cout<<' '<<i;
    55             else {cout<<i;f=1;}
    56         }
    57     }
    58     putchar('
    ');
    59     f=0;
    60     for(i=1;i<=n;i++)
    61     {
    62         if(c[i]==-1)
    63         {
    64             if(f) cout<<' '<<i;
    65             else {cout<<i;f=1;}
    66         }
    67     }
    68 system("pause"); 69 return 0; 70 }
  • 相关阅读:
    C# 集合类 :(Array、 Arraylist、List、Hashtable、Dictionary、Stack、Queue)
    "Isa"与"Hasa"
    Access、SQLite、HSQLDB、Sybase、MySQL、DB4O比较
    C#反射(二)
    跳出语句
    C#反射(一)
    返回集合使用IEnumerable<>还是IList<>
    理解C#值类型与引用类型
    WF4 Beta2 工作原理
    Interesting thing with WF4 Activity Scheduling
  • 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/noip200802.html
Copyright © 2020-2023  润新知