题目描述: 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的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; }