洛谷P1056-排座椅

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

同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道。

于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了22会交头接耳的同学,那么他们就不会交头接耳了。

请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。
在这里插入图片描述
在这里插入图片描述

//洛谷P1056 排座椅
#include<iostream>
using namespace std;
int m,n,k,l,d,i,j,p,t=0;//学生分M行N列,在其中插入K行,L列 ,D对同学会交头接耳
int dd[100][5]; //存储交头接耳的一对同学的行、列位置 
int stu[1001][1001]={0}; //学生座位表 
int kk[1001]={0},ll[1001]={0};
int paixuk[1001]={0},paixul[1001]={0};
int tem=0;
//kk[1001]存储第k行是过道时,能分开的说话同学有几对,ll[1001]存储第l列是过道时,能分开的说话同学有几对 
//paixuk[1001]是对kk[1001]中的数字进行排序,最后排序输出共k行的行号
//paixul[1001]是对ll[1001]中的数字进行排序,最后排序输出共l列的列号
int maxnum=0,s;
int main()
{
	cin>>m>>n>>k>>l>>d;
	for(i=1;i<=d;i++)
		cin>>dd[i][1]>>dd[i][2]>>dd[i][3]>>dd[i][4];
		//输入d对相互讲话的同学的坐标 
	for(i=1;i<=m-1;i++)
		for(p=1;p<=d;p++)
			if((dd[p][1]==i&&dd[p][3]-1==i)||(dd[p][1]-1==i&&dd[p][3]==i))
			//如果某一对讲话的同学,他们的行坐标为i和i+1,则被分开 
			kk[i]++;
//以上for循环求出第i行和第i+1行之间有过道时,能够分开的讲话同学的有几对	
	
	for(j=1;j<=n-1;j++)
		for(p=1;p<=d;p++)
			if((dd[p][2]==j&&dd[p][4]-1==j)||(dd[p][2]-1==j&&dd[p][4]==j))
			//如果某一对讲话的同学,他们的列坐标为j和j+1,则被分开
			ll[j]++;
//以上for循环求出第j列和第j+1列之间有过道时,能够分开的讲话同学的有几对		
//for(i=1;i<=m-1;i++)
//cout<<"kk["<<i<<"]="<<kk[i]<<endl;
//for(j=1;j<=n-1;j++)
//cout<<"ll["<<j<<"]="<<ll[j]<<endl;

	s=1;
	//找出横向k条线 
	while(s<=k)
	{
		maxnum=0;t=1;
		for(i=1;i<=m-1;i++)
			if(maxnum<kk[i])
			{
				maxnum=kk[i];
				t=i;
			}
		paixuk[s]=t;
		kk[t]=0;
		s++;
	}
	s=1;
	//找出纵向l条线 
	while(s<=l){
		maxnum=0;t=1;
		for(i=1;i<=n-1;i++)
			if(maxnum<ll[i])
			{
				maxnum=ll[i];
				t=i;
			}
		paixul[s]=t;
		ll[t]=0;
		s++;
	}

	for(i=1;i<=k;i++)
		for(j=i+1;j<=k;j++)
		{
			if(paixuk[i]>paixuk[j])
			{
				tem=paixuk[i];
				paixuk[i]=paixuk[j];
				paixuk[j]=tem;
			}
			
		}
		for(i=1;i<=l;i++)
			for(j=i+1;j<=l;j++)
			{
				if(paixul[i]>paixul[j])
				{
				tem=paixul[i];
				paixul[i]=paixul[j];
				paixul[j]=tem;
				}
			
			}
	for(i=1;i<=k;i++)
	cout<<paixuk[i]<<" ";
	cout<<endl;
	for(j=1;j<=l;j++)
	cout<<paixul[j]<<" ";
	cout<<endl;
	return 0;
}

测试点2输入数据:
200 200 53 80 2000
10 55 11 55
162 110 162 109
81 144 80 144
44 4 44 3
106 173 105 173
148 21 149 21
172 137 173 137
167 101 167 102
73 49 73 50
48 115 48 114
113 107 113 106
60 58 60 57
37 118 36 118
89 100 89 99
181 3 181 2
92 23 91 23
165 199 165 200
22 51 21 51
194 106 194 107
10 180 10 181
117 105 116 105
182 147 182 148
139 52 139 53
10 115 9 115
89 9 88 9
134 65 134 66
2 195 1 195
161 22 162 22
9 47 9 48
5 21 5 22
102 192 103 192
85 177 85 178
52 123 52 124
158 58 158 59
176 59 175 59
105 44 105 45
40 62 40 61
64 74 64 73
101 44 101 45
81 4 82 4
105 83 106 83
66 93 67 93
105 123 105 122
164 130 164 129
64 46 64 45
194 187 194 188
178 148 179 148
129 149 128 149
135 53 134 53
63 144 63 143
19 78 19 79
105 44 106 44
90 166 89 166
173 177 174 177
130 118 129 118
128 191 129 191
192 32 193 32
144 157 144 156
44 62 43 62
70 70 70 69
139 142 140 142
187 133 187 134
7 99 8 99
2 98 2 97
180 104 180 103
163 183 163 184
153 6 153 7
112 163 112 162
194 171 195 171
135 143 134 143
112 179 112 178
89 186 89 185
165 172 165 171
178 7 179 7
106 136 107 136
123 48 123 49
118 144 118 143
115 18 114 18
22 79 23 79
98 30 99 30
130 135 131 135
44 140 44 141
194 47 195 47
31 160 32 160
95 146 95 145
17 180 16 180
15 151 16 151
152 60 152 59
78 153 78 154
83 60 84 60
42 196 41 196
7 167 7 166
106 41 105 41
117 184 118 184
52 156 53 156
94 27 95 27
104 6 104 5
70 110 70 109
173 74 172 74
98 73 98 72
128 28 127 28
112 21 112 20
125 164 126 164
135 117 135 116
99 20 99 21
63 194 64 194
75 84 75 83
124 163 124 162
166 84 166 85
141 103 141 104
34 115 34 116
119 21 119 22
174 54 175 54
172 93 173 93
48 100 47 100
132 95 131 95
148 78 148 79
21 60 20 60
153 47 153 48
49 28 48 28
19 157 18 157
160 96 160 97
36 147 37 147
189 74 189 75
184 107 183 107
52 78 51 78
77 114 78 114
122 132 121 132
162 132 162 133
65 63 65 62
67 119 67 118
24 103 25 103
11 169 11 170
147 157 148 157
139 73 138 73
10 40 10 39
45 122 45 121
185 92 186 92
69 134 68 134
46 180 47 180
48 186 48 187
62 11 62 10
77 1 76 1
120 72 120 71
147 178 147 179
39 36 38 36
77 29 78 29
152 138 153 138
170 106 170 105
150 145 150 144
153 159 154 159
165 71 165 72
15 156 15 155
134 191 133 191
67 6 67 5
192 71 192 70
180 51 180 52
183 79 182 79
41 141 42 141
54 14 54 13
9 148 10 148
115 179 116 179
60 131 60 130
143 165 142 165
17 10 18 10
97 93 96 93
171 170 171 169
148 57 148 56
130 8 131 8
169 119 170 119
111 62 110 62
64 50 64 51
12 113 13 113
8 135 9 135
136 64 136 63
109 167 109 168
153 67 154 67
158 41 158 42
72 131 73 131
90 88 90 89
55 181 55 182
182 155 183 155
71 190 72 190
58 189 59 189
123 190 123 189
117 19 116 19
7 194 7 193
56 13 57 13
182 88 181 88
6 11 5 11
17 125 18 125
137 41 136 41
196 148 196 149
108 64 109 64
112 176 111 176
106 114 105 114
163 111 164 111
185 95 186 95
116 133 115 133
27 9 28 9
169 164 169 165
150 162 150 161
90 109 91 109
179 174 179 175
114 10 113 10
107 58 107 57
106 120 107 120
141 123 142 123
89 113 89 114
128 85 128 84
194 69 194 68
11 162 10 162
108 73 109 73
92 66 91 66
146 132 146 131
129 21 130 21
21 27 20 27
110 51 110 50
95 41 96 41
13 77 13 78
182 187 181 187
153 50 154 50
60 75 61 75
165 44 166 44
197 117 197 116
189 103 189 104
150 53 151 53
24 95 24 94
74 143 74 144
43 82 44 82
23 164 23 163
40 95 41 95
108 39 108 40
56 52 56 51
94 154 93 154
23 200 24 200
50 30 49 30
93 19 92 19
36 169 36 170
146 188 145 188
137 67 137 66
165 54 164 54
66 75 65 75
75 128 75 129
138 156 139 156
160 46 160 47
66 129 67 129
90 167 91 167
14 98 14 99
64 174 64 173
100 178 99 178
190 54 191 54
45 124 45 125
161 132 161 133
75 118 76 118
72 56 73 56
43 175 43 174
85 17 86 17
95 99 95 100
136 132 136 133
44 91 43 91
168 133 169 133
155 150 154 150
187 84 186 84
178 177 178

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mengdicfm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值