一二三四五 上山打老虎

NC16618-排座椅

题目链接:https://ac.nowcoder.com/acm/problem/16618

题意:有个m行n列的座位,可以加上k行l列走廊,走廊可以隔断两个相邻的交头接耳的同学,总共有d对交头接耳的同学,给出2*d对坐标表示他们,输出一行k个数一行为l个数表示走廊安排的位置来达到隔断交头接耳同学数目最多。

思路:让交头接耳的同学最少,贪心,记录交头接耳的同学需要哪行或者哪列来隔断,然后按照需求值分别排序后取前k和l个再根据需要进行排序后输出。

坑点:m行n列 跟平常数据中n行m列不习惯

反思:在数据范围较小的情况下,重载STL中的容器排序方式不如用数组+sort+自定义排序去实现。

#include<iostream>
#include<algorithm>
using namespace std;
struct node{
    int no,num=0;
}al[(int)2e3+5],ar[(int)2e3+5];
bool cmpno(struct node s,struct node t){
    return s.no<t.no;
}
bool cmpnum(struct node s,struct node t){
    return s.num>t.num;
}
int main (){
    int n,m,k,l,d;
    cin>>n>>m>>k>>l>>d;
    int xa,ya,xb,yb;
    int no=0;
    for(int i=0;i<=n;i++)
        al[i].no=i;
    for(int i=0;i<=m;i++)
        ar[i].no=i;
    for(int i=0;i<d;i++){
        cin>>xa>>ya>>xb>>yb;
        if(xa==xb){//y l个
           no=min(ya, yb);
           al[no].num++;
        }
        else{//k
          no=min(xa, xb);
           ar[no].num++;
        }
    }
    sort(al,al+n+1,cmpnum);
    sort(al,al+l,cmpno);
    sort(ar,ar+m+1,cmpnum);
    sort(ar,ar+k,cmpno);
    for(int i=0;i<k;i++)
        cout<<ar[i].no<<" ";
    cout<<endl;
    for(int i=0;i<l;i++)
        cout<<al[i].no<<" ";
    
    return 0;
}

posted @ 2021-01-23 14:05  黒川川  阅读(105)  评论(0)    收藏  举报