zoukankan      html  css  js  c++  java
  • TZOJ 4855 排座椅(贪心)

    描述

    上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来后,只有有限的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个整数,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,每两个整数之间用空格隔开(行尾没有空格)。

    样例输入

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

    样例输出

    2
    2 4

    题意

    如上

    题解

    贪心,考虑过每条线有几组交头接耳,然后每次选取最大的,最后排序从小到大输出

    代码

     1 #include<stdio.h>
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 int main(){
     6     int i,j,x,y,x1,y1,m,n,K,L,D,k[1005]={0},l[1005]={0};
     7     scanf("%d%d%d%d%d",&m,&n,&K,&L,&D);
     8     
     9     for(i=0;i<D;i++){
    10         scanf("%d%d%d%d",&x,&y,&x1,&y1);
    11         if(x==x1)
    12             l[min(y,y1)]++; 
    13         if(y==y1)
    14             k[min(x,x1)]++;
    15     }
    16     
    17     int a[1005],b[1005];
    18     int ka=0,kb=0;//a和b的总个数 
    19     int maxx,pos;//pos代表位置 
    20     for(i=0;i<K;i++){
    21         maxx=0;
    22         for(j=1;j<=m;j++)
    23             if(k[j]>maxx)
    24                 maxx=k[j],pos=j;
    25         k[pos]=0; 
    26         a[ka++]=pos;
    27     }
    28     for(i=0;i<L;i++){
    29         maxx=0;
    30         for(j=1;j<=n;j++)
    31             if(l[j]>maxx)
    32                 maxx=l[j],pos=j;
    33         l[pos]=0;
    34         b[kb++]=pos;
    35     }
    36     
    37     sort(a,a+ka);
    38     sort(b,b+kb);
    39     for(i=0;i<ka;i++){
    40         if(i==0)printf("%d",a[i]);
    41         else printf(" %d",a[i]);
    42     }
    43     puts("");
    44     for(i=0;i<kb;i++){
    45         if(i==0)printf("%d",b[i]);
    46         else printf(" %d",b[i]);
    47     }
    48     puts("");
    49     return 0;
    50 }
  • 相关阅读:
    HDU Problem 1811 Rank of Tetris【拓扑排序+并查集】
    POJ Problem 2367 Genealogical tree【拓扑排序】
    HDU Problem 2647 Reward【拓扑排序】
    HDU Problem 1285 确定比赛名次【拓扑排序】
    HDU Problem HDU Today 【最短路】
    HDU Problem 3665 Seaside【最短路】
    HDU Problem 一个人的旅行 【最短路dijkstra】
    HDU Problem 1596 find the safest road【最短路dijkstra】
    Beyond Compare文本合并进行内容替换要注意什么
    用这些工具都可以比较代码的差异
  • 原文地址:https://www.cnblogs.com/taozi1115402474/p/8366309.html
Copyright © 2011-2022 走看看