题目描述:
上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。
同学们在教室中坐成了MM行NN列,坐在第i行第j列的同学的位置是(i,j)(i,j),为了方便同学们进出,在教室中设置了KK条横向的通道,LL条纵向的通道。
于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了22个会交头接耳的同学,那么他们就不会交头接耳了。
请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。
…
…
…
…
AC代码:
#include<iostream>
using namespace std;
int main()
{
int m,n,k,l,d;
cin>>m>>n>>k>>l>>d;
int a[d][4],X[m]={0},Y[n]={0};
for(int i=0;i<d;i++)
for(int j=0;j<4;j++)
cin>>a[i][j];
for(int i=0;i<d;i++)
{
if(a[i][0]==a[i][2])
{
if(a[i][1]>a[i][3])Y[a[i][3]]++;
else Y[a[i][1]]++;
}
else{
if(a[i][0]>a[i][2])X[a[i][2]]++;
else X[a[i][0]]++;
}
}//得到 对某排或某列而言 若有过道 可以减少多少组说话学生
int x1=0,y1=0,shuchu_x[d]={0},shuchu_y[d]={0},xx[m]={0},yy[n]={0};
for(int i=d;i>0;i--){
for(int j=1;j<m;j++){
if(X[j]==i&&xx[j]==0){
x1++; xx[j]=1;shuchu_x[j]=1;
}
if(x1>=k)break;
}
if(x1>=k)break;
}//从减少组数大的开始找,若找到则令shuchu_x=1
for(int i=d;i>0;i--){
for(int j=1;j<n;j++){
if(Y[j]==i&&yy[j]==0){
y1++;yy[j]=1;shuchu_y[j]=1;
}
if(y1>=l)break;
}
if(y1>=l)break;
}
if(k!=0){
int x1=0;
for(int i=1;i<m;i++)
if(shuchu_x[i]==1){
cout<<i;x1=i;break;
}
for(int i=x1+1;i<m;i++)
if(shuchu_x[i]==1)
cout<<" "<<i;cout<<endl;
}
if(l!=0){
int y1=0;
for(int i=1;i<n;i++)
if(shuchu_y[i]==1){
cout<<i;y1=i;break;
}
for(int i=y1+1;i<n;i++)
if(shuchu_y[i]==1)
cout<<" "<<i;
cout<<endl;
}
return 0;
}