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;
}

浙公网安备 33010602011771号