上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。
同学们在教室中坐成了MM行NN列,坐在第i行第j列的同学的位置是(i,j)(i,j),为了方便同学们进出,在教室中设置了KK条横向的通道,LL条纵向的通道。
于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了22个会交头接耳的同学,那么他们就不会交头接耳了。
请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。
输入输出格式
输入格式:
第一行,有55个用空格隔开的整数,分别是M,N,K,L,D(2≤N,M≤1000,0≤K<M,0≤L<N,D≤2000)M,N,K,L,D(2≤N,M≤1000,0≤K<M,0≤L<N,D≤2000)
接下来的DD行,每行有44个用空格隔开的整数。第ii行的44个整数Xi,Yi,Pi,QiXi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)(Xi,Yi)与(Pi,Qi)(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。
输入数据保证最优方案的唯一性。
输出格式:
共两行。
第一行包含KK个整数a1,a2,…,aKa1,a2,…,aK,表示第a1a1行和a1+1a1+1行之间、第a−2a−2行和a2+1a2+1行之间、…、第aKaK行和第aK+1aK+1行之间要开辟通道,其中ai<ai+1ai<ai+1,每两个整数之间用空格隔开(行尾没有空格)。
第二行包含LL个整数b1,b2,…,bLb1,b2,…,bL,表示第b1b1列和b1+1b1+1列之间、第b2b2列和b2+1b2+1列之间、…、第bLbL列和第bL+1bL+1列之间要开辟通道,其中bi<bi+1bi<bi+1,每两个整数之间用空格隔开(列尾没有空格)。
Input
4 5 1 2 3 4 2 4 3 2 3 3 3 2 5 2 4
Output
2 2 4
一步步来,变量有点多
变量的归属
i 第几列,输出l个 a L z
j 第几行,输出k个 b K x
#include <iostream>
#include <algorithm>
using namespace std;
int m,n,k,l,d,x1,x2,y1,y2,i[2000],j[2000],a=0,b=0,e,f=1000,K[1000],L[1000],g,h,z[1000],x[1000];
int main()
{
cin>>m>>n>>k>>l>>d;
int k1=k,l1=l;
while (d--)
{
cin>>x1>>y1>>x2>>y2;
if (x1==x2)//同一行
{
i[a++]=y1>y2?y2:y1;//第几列
}
else
{
j[b++]=x1>x2?x2:x1; //第几行
}
}
for (e=0;e<b;e++)
{
K[j[e]]++;
}
for (e=0;e<a;e++)
{
L[i[e]]++;
}
while (k1--)
{
int max=0;
for (e=0;e<f;e++)
{
if (max<K[e])
{
max=K[e];
g=e;//g就是最有效的那行
}
}
x[k1]=g;
K[g]=0;
}
f=1000;
while (l1--)
{
int max=0;
for (e=0;e<f;e++)
{
if (max<L[e])
{
max=L[e];
g=e;
}
}
z[l1]=g;
L[g]=0;
}//先行K后列L
sort(x,x+k);
sort(z,z+l);
for (e=0;e<=k-1;e++)
{
if (e!=0) cout<<" ";
cout<<x[e];
}
cout<<endl;
for (e=0;e<=l-1;e++)
{
if (e!=0) cout<<" ";
cout<<z[e];
}
cout<<endl;
}