2 条题解
-
0
好,“最优解”“最佳方案”要么贪心要么dp
但这是普及组的题,所以是贪心既然是贪心,那我们就考虑贪心策略 很显然,当有多个会说话的同学能被一条路隔开的时候,肯定是最方便的 那么我们就可以先预处理出每一行或列上有多少对说话的同学,再运用桶排序(因为数据范围小)求出人最多的那一列或行,那么那一列或行就需要一条路分开 然后再输出就可以了#include<bits/stdc++.h> using namespace std; int m,n,k,l,d; int x[1005],y[1005]; int c[1005],o[1005]; int main() { scanf("%d%d%d%d%d",&m,&n,&k,&l,&d); for(int i=1;i<=d;i++) { int xi,yi,pi,qi; scanf("%d%d%d%d",&xi,&yi,&pi,&qi); if(xi==pi)//如果在同一行 { x[min(yi,qi)]++;//注意是min,因为默认的是a,a+1 } else//如果在同一列 { y[min(xi,pi)]++; } } for(int i=1;i<=k;i++)//桶排 { int max1=-1;//设最大值便于找数量最多的 int p; for(int j=1;j<m;j++) { if(y[j]>max1) { max1=y[j]; p=j; } } y[p]=0;//注意找到了一定要设为零不让你排多少次最大的都是他 c[p]++; } for(int i=1;i<=l;i++) { int max1=-1; int p; for(int j=1;j<n;j++) { if(x[j]>max1) { max1=x[j]; p=j; } } x[p]=0; o[p]++; }//同上 for(int i=0;i<1005;i++) { if(c[i]) printf("%d ",i); } cout<<endl; for(int i=0;i<1005;i++) { if(o[i]) printf("%d ",i); }//输出 return 0; }
-
0
/贪心策略: 分行列,找到分开学生最多的一条过道/
/*贪心策略: 分行列,找到分开学生最多的一条过道*/ #include<bits/stdc++.h> using namespace std; int a[2][2000],b,c,d,e,f,g,h,k,l,m[2][2000]; //a[][]=>row,line; //b=>row, c=>line, d=>cut row, e=>cut line; //g,h,k,l=>Ax,Ay,Bx,By; bool way (int a,int b) { return a>b; } void pai (int a[],int b[],int c,int d) { int e[1000]; for (int i=0;i<1000;i++) e[i]=i;//catch row/line num for (int i=0;i<c;i++) for (int j=0;j<c-1;j++) if (a[j]<a[j+1]) { swap (a[j],a[j+1]); swap (e[j],e[j+1]); }//sort ,catch sort for (int i=0;i<d;i++) b[i]=e[i];//num turn return; } int main() { cin>>b>>c>>d>>e>>f;//d=>a[0];e=>a[1];f=>D for (int i=0;i<f;i++) { cin>>g>>h>>k>>l; if (g==k) a[1][min(h,l)]++;//x=x => row=row => cut line; if (h==l) a[0][min(g,k)]++; } pai (a[0],m[0],b,d); pai (a[1],m[1],c,e); sort (m[0],m[0]+d); sort (m[1],m[1]+e);//resort <<< for (int i=0;i<d;i++) { cout<<m[0][i]; if (i!=d-1) cout<<" "; } cout<<endl; for (int i=0;i<e;i++) { cout<<m[1][i]; if (i!=e-1) cout<<" "; }//cout return 0; }
- 1
信息
- ID
- 164
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 15
- 已通过
- 9
- 上传者