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

题解:
贪心,因为你的行数和列数是一定得,所以每用一行或一列就需要尽量隔开尽量多得学生,所以我们首先需要统计,对于每一列来说,这一列有多少个说话得学生,然后按照人数进行排序,然后选取人数尽量多得列进行相隔,
行也如此。

再对选出来得进行由小到大排序(题目要求从小到大输出) 输出即可

代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#include <queue>
#include <string>
//#define int long long
const int maxn = 1e3+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1e9+7;
using namespace std;

struct node{
    int id,cnt;
};
node a[maxn],b[maxn];

void init(){
    for(int i=0;i<1001;i++){
        a[i].id=i;
        b[i].id=i;
    }
}
//行号 x  a
//列好 y  b
struct rule{
    bool operator () (const node & a,const node & b){
        return a.cnt>b.cnt;
    }
};

int main()
{
    int n,m,k,l,d;
    init();
    cin>>n>>m>>k>>l>>d;
    for(int i=0;i<d;i++){
        int x1,y1,x2,y2;
        cin>>x1>>y1>>x2>>y2;
        if(x1==x2){
            int pos=min(y1,y2);
            b[pos].cnt++;
        }
        else{
            int pos=min(x1,x2);
            a[pos].cnt++;
        }
    }
    sort(a,a+1000,rule());
    sort(b,b+1000,rule());
    vector<int> ans1,ans2;
    for(int i=0;i<k;i++)  ans1.push_back(a[i].id);
    for(int i=0;i<l;i++)  ans2.push_back(b[i].id);
    sort(ans1.begin(),ans1.end());
    sort(ans2.begin(),ans2.end());
    for(auto it : ans1){
        if(it==ans1.back()) cout<<it<<endl;
        else cout<<it<<" ";
    }
    for(auto it : ans2){
        if(it==ans2.back()) cout<<it<<endl;
        else cout<<it<<" ";
    }
    return 0;
}