洛谷P1056 排座椅

洛谷P1056 排座椅

一只鶸的刷题记录

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

//贪心
#include 

using namespace std;

int x[1005],y[1005];
int a[1005],b[1005];
int main()
{
    int m,n,k,l,d;
    cin>>m>>n>>k>>l>>d;

    //贪心,看哪一条线能分开尽可能多的上课聊天的
    int ai,bi,ci,di;
    for(int i=0;i<d;i++)
    {
        cin>>ai>>bi>>ci>>di;
        if(ai==ci)x[min(bi,di)]++;
        if(bi==di)y[min(ai,ci)]++;
    }

    //桶排序,输入不是很大,没有必要优化
    for(int i=0;i<k;i++)
    {
        int maxn=-1;
        int index=-1;
        for(int j=1;j<m;j++)
        {
            if(y[j]>maxn)
            {
                maxn=y[j];
                index=j;
            }
        }
        y[index]=0;
        a[index]++;
    }

    for(int i=0;i<l;i++)
    {
        int maxn=-1;
        int index=-1;
        for(int j=1;j<n;j++)
        {
            if(x[j]>maxn)
            {
                maxn=x[j];
                index=j;
            }
        }
        x[index]=0;
        b[index]++;
    }

    //输出结果,坑点:输出也是要排序的
    for(int i=0;i<1005;i++)
    {
        if(a[i])
            cout<<i<<" ";
    }
    cout<<endl;
    for(int i=0;i<1005;i++)
    {
        if(b[i])
            cout<<i<<" ";
    }
    cout<<endl;
    return 0;
}

你可能感兴趣的:(刷题)