排座椅
排座椅
https://ac.nowcoder.com/acm/problem/16618
分析
显然横向通道和纵向通道的放置是相互独立的,所以我们可以只考虑放一种通道应该怎么放,
贪心的放,优先放更多对的地方,可以拆分的对数会更多。
#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define int long long
const int inf = 0x3f3f3f3f;
const int maxn = 2110;
const int M = 1e9+7;
int n,m,k,l,d;
int a[maxn],b[maxn];
struct node
{
int x,id;
bool operator < (const node tmp) const
{
return x > tmp.x;
}
}c[maxn];
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);
cin>>n>>m>>k>>l>>d;
int x1,x2,y1,y2;
for(int i = 1; i <= d; i++)
{
cin>>x1>>y1>>x2>>y2;
if(x1 == x2)
{
b[min(y1,y2)]++; //竖线
}
else
{
a[min(x1,x2)]++; //横线
}
}
for(int i = 1; i <= m; i++)
{
c[i].x = a[i];
c[i].id = i;
}
sort(c+1,c+1+m);
for(int i = 1; i <= k; i++) a[i] = c[i].id;
sort(a+1,a+1+k);
for(int i = 1; i <= k; i++) cout<<a[i]<<' ';
cout<<endl;
for(int i = 1; i <= n; i++)
{
c[i].x = b[i];
c[i].id = i;
}
sort(c+1,c+1+n);
for(int i = 1; i <= l; i++) b[i] = c[i].id;
sort(b+1,b+1+l);
for(int i = 1; i <= l; i++) cout<<b[i]<<' ';
cout<<endl;
return 0;
}
查看9道真题和解析