P1056 [NOIP2008 普及组] 排座椅 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
解题思路
1.先判断两个交头接耳的人中间的过道是横向还是纵向
2.要使方案最优,使用桶排序,记录两个交头接耳的人中需要设置哪条通道,被需要最多的通道一定要设置
3.遍历桶排序中的所有值,找出最大值,把最大值的数值设为-1
4.输出数组中值为-1的下标
#include<bits/stdc++.h>
using namespace std;
int a[1005],b[1005];//创建数组
int main()
{
int m,n,k,l,d,x,y,p,q,max=-1,t;
cin>>m>>n>>k>>l>>d;
for(int i=1;i<=d;i++)
{
cin>>x>>y>>p>>q;
if(abs(x-p)==1)
{
a[min(x,p)]++;//横向
}
if(abs(y-q)==1)
{
b[min(y,q)]++;//纵向
}
}
for(int i=1;i<=k;i++)
{
max=-1;
for(int j=1;j<=1000;j++)
{
if(a[j]>max)
{
max=a[j];//记录能分开多少对交头接耳的学生的最大值
t=j;//记录下标
}
}
a[t]=-1;//最多能分开的交头接耳的学生
}//横向
for(int i=1;i<=l;i++)
{
max=-1;
for(int j=1;j<=1000;j++)
{
if(b[j]>max)
{
max=b[j];//记录能分开多少对交头接耳的学生的最大值
t=j;//记录下标
}
}
b[t]=-1;//最多能分开的交头接耳的学生
}//纵向
for(int i=1;i<=1000;i++)
{
if(a[i]==-1)
{
cout<<i<<" ";//输出横向的过道
}
}
cout<<endl;
for(int i=1;i<=1000;i++)
{
if(b[i]==-1)
{
cout<<i<<" ";//输出纵向的过道
}
}
return 0;
}