zoukankan      html  css  js  c++  java
  • codevs 1147 排座椅

    传送门

    题目描述

    上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的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条粗线的位置表示通道,图示的通道划分方案是唯一的最佳方案。

    2008年普及组第二题

    【题目大意】

    每行、列给你几条确定的直线,让你用直线使更多成对的点分开。

    【思路】

    贪心

    线的条数是有限的,那么贪心的想每使用一条直线分开的点越多越好。

    所以row[i]记录行i和i+1交头接耳的对数,col[i]记录i列和i+1列交头接耳人数。

    进行排序,划分。我开始没列和行人数都统计排序太麻烦,还是用row[i]来记录i和i+1比较方便

    【code】

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int row[1002],col[1002];
    int n,m,k,l,d;
    struct date
    {
        int num,id;
    }w[1002];
    bool cmp(date x,date y)
    {
        return x.num >y.num;
    }
    bool cmp_id(date x,date y)
    {
        return x.id<y.id;
    }
    int main()
    {
        scanf("%d%d%d%d%d",&m,&n,&k,&l,&d);
        for(int i=1;i<=d;i++)
        {
            int x1,y1,x2,y2;
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            if(x1==x2)
            {
                col[min(y1,y2)]++;
            }
            if(y1==y2)
            {
                row[min(x1,x2)]++;
            }
        }
        for(int i=1;i<=m;i++)
        {
        w[i].num=row[i];w[i].id=i;
        }
        sort(w+1,w+m+1,cmp);
        sort(w+1,w+k+1,cmp_id);
        int s=1,p=1;
        while(k)
        {
            printf("%d ",w[s].id);
            s++;
            k--;
        }
        for(int i=1;i<=n;i++)
        w[i].num=col[i],w[i].id=i;
        sort(w+1,w+n+1,cmp);
        sort(w+1,w+l+1,cmp_id);
        printf("
    ");
        while(l)
        {
            printf("%d ",w[p].id);
            p++;
            l--;
        }
        return 0;
    }
  • 相关阅读:
    The Future of Middleware and the BizTalk Roadmap
    FW: How to spawn a process that runs under the context of the impersonated user in Microsoft ASP.NET pages
    Strips illegal Xml characters
    luogu P2280 激光炸弹(二维前缀和)
    luogu P2704 炮兵阵地(经典状态压缩DP)
    SP1716 GSS3 Can you answer these queries III (线段树维护最大连续子段和)
    二分图判定、匹配问题
    C++语法综合 | 基于char*设计一个字符串类MyString
    luogu P1044 火车进出栈问题(Catalan数)
    C++设计模式 | 三种设计模式基础
  • 原文地址:https://www.cnblogs.com/zzyh/p/6995126.html
Copyright © 2011-2022 走看看