洛谷 P1056 排座椅
本题是一道模拟题。
很容易想到要一条走廊要尽量分开越多想讲话的人越划算
于是我们先处理处每条走廊有几个人要和下一条走廊的人讲话
然后丢进优先队列里按照讲话的人数排序
最后按照序号先后顺序桶排一波
然后搜一遍输出
附图:(没用的点可以不看,只看绿的和红的)(懒得改图了)
代码:
#include<bits/stdc++.h>
using namespace std;
int m,n,k,l,d;
int x,y,p,q;
int fi[1010],fj[1010],ansi[1010],ansj[1010];
priority_queue <pair<int,int> > qi;
priority_queue <pair<int,int> > qj;
int main()
{
cin>>m>>n>>k>>l>>d;
for (int i=1;i<=d;i++){
cin>>x>>y>>p>>q;
if (x==p){
if (y+1==q) fj[y]++;
if (y==q+1) fj[q]++;
}
if (y==q){
if (x+1==p) fi[x]++;
if (x==p+1) fi[p]++;
}
}
for (int i=1;i<=m;i++) qi.push(make_pair(fi[i],i));
for (int j=1;j<=n;j++) qj.push(make_pair(fj[j],j));
for (int i=1;i<=k;i++) ansi[qi.top().second]=1,qi.pop();
for (int j=1;j<=l;j++) ansj[qj.top().second]=1,qj.pop();
for (int i=1;i<=m;i++) if (ansi[i]==1) cout<<i<<" ";
cout<<endl;
for (int j=1;j<=n;j++) if (ansj[j]==1) cout<<j<<" ";
cout<<endl;
return 0;
}