算法:贪心

思路:优先选隔开说话人多的线,用pair来存每条线能需要分隔次数和位置,然后用sort按照分隔次数从大到小排序,输出即可

时间复杂度:

代码:

#include <bits/stdc++.h>
using namespace std;
const int N=2010;

typedef pair<int,int> PII;
PII row[N],col[N];  //first表示需要分隔次数,second表示分隔线位置
int ans[N];

bool cmp(PII x,PII y){
    return x.first>y.first;
}

int main(){
    int m,n,k,l,d,cnt;
    cin>>m>>n>>k>>l>>d;

    for (int i = 1; i <= n; i ++ ) row[i].second = i;
    for (int i = 1; i <= m; i ++ ) col[i].second = i;

    while(d--){
        int x1,y1,x2,y2;
        cin>>x1>>y1>>x2>>y2;
        if(x1==x2) col[min(y1,y2)].first ++;
        else row[min(x1,x2)].first ++;
    }

    sort(row+1,row+n+1,cmp);
    cnt=0;
    for(int i=1;i<=k;i++){
        ans[cnt++]=row[i].second;
    } 
    sort(ans,ans+k);
    for(int i=0;i<k;i++){
        cout<<ans[i]<<" ";
    } 
    cout<<endl;

    sort(col+1,col+m+1,cmp);
    cnt=0;
    for(int i=1;i<=l;i++){
        ans[cnt++]=col[i].second;
    } 
    sort(ans,ans+l);
    for(int i=0;i<l;i++){
        cout<<ans[i]<<" ";
    } 
    cout<<endl;

    return 0;
}