题目:
注意:1.题目中说“最佳方案”,应该就是用贪心。
2,只要找到相邻的两行或两列可以隔开的同学最多,就OK了
3,定义表示行和列的两个数组x,y,x[1]表示第一列和第二列可以分开说话的同学。输入同学的坐标,如果横坐标相等,表示两个人在同一行,假设其纵坐标为a,b,如果a<b,则x[a]++(别忘了判断大小)。
4,最后就是桶排序。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,k,l,d;
int x[1010],y[1010];//表示横纵坐标
int a[1010],b[1010];//用于桶排序
int main()
{
cin>>m>>n>>k>>l>>d;
for(int i=1;i<=d;i++)
{
int xi,yi,pi,qi;
cin>>xi>>yi>>pi>>qi;
if(xi==pi)//表明在同一行,所以隔开这两列
x[min(yi,qi)]++;
else
y[min(xi,pi)]++;
}
for(int i=1;i<=k;i++)//开始桶排序
{
int maxn=-1;
int t;
for(int j=1;j<m;j++){
if(y[j]>maxn)
{
maxn=y[j];
t=j;
}
}
y[t]=0;//清零
a[t]++;//桶排序
}
for(int i=1;i<=l;i++)
{
int maxn=-1;
int t;
for(int j=1;j<n;j++){
if(x[j]>maxn)
{
maxn=x[j];
t=j;
}
}
x[t]=0;
b[t]++;
}
for(int i=0;i<1010;i++)
{
if(a[i])//表示这行需要隔开
cout<<i<<" ";
}
cout<<endl;
for(int i=0;i<1010;i++){
if(b[i])
cout<<i<<" ";
}
return 0;
}