上图中用符号*、※、+ 标出了3对会交头接耳的学生的位置,图中3条粗线的位置表示通道,图示的通道划分方案是唯一的最佳方案。
贪心算法,行和列分别按照从大到小的方式排列。但是要注意排序问题,特别注意要排两次序!!
1 #include <bits/stdc++.h>
2 #define FOP freopen("in.txt","r",stdin)
3 using namespace std;
4
5 typedef long long ll;
6 struct node
7 {
8 int num,id;
9 }a[1005],b[1005];
10 bool cmp(node a,node b)
11 {
12 // if(a.num==b.num) return a.id<b.id;
13 return a.num>b.num;
14 }
15 bool cmp1(node a,node b)
16 {
17 return a.id<b.id;
18 }
19 int m,n,k,l,d,x,y,xx,yy;
20 void init()
21 {
22 for(int i=1;i<=n;i++)
23 a[i].id=i;
24 for(int i=1;i<=m;i++)
25 b[i].id=i;
26 }
27 int main()
28 {
29 // FOP;
30 cin>>m>>n>>k>>l>>d;
31 init();
32 int tmp;
33 for(int i=0;i<d;i++)
34 {
35 cin>>x>>y>>xx>>yy;
36 if(x==xx)
37 {
38 tmp=min(y,yy);
39 b[tmp].num++;
40 // b[tmp].id=tmp;
41 }
42 else
43 {
44 tmp=min(x,xx);
45 a[tmp].num++;
46 // a[tmp].id=tmp;
47 }
48 }
49 sort(a+1,a+1+n,cmp);
50 sort(b+1,b+1+m,cmp);
51 sort(a+1,a+1+k,cmp1);
52 sort(b+1,b+1+l,cmp1);
53 for(int i=1;i<=k;i++)
54 {
55 if(i!=1) cout<<" ";
56 cout<<a[i].id;
57 }
58 cout<<endl;
59 for(int i=1;i<=l;i++)
60 {
61 if(i!=1) cout<<" ";
62 cout<<b[i].id;
63 }
64 cout<<endl;
65 return 0;
66 }
View Code