2 条题解

  • 0
    @ 2023-2-14 18:15:00

    好,“最优解”“最佳方案”要么贪心要么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
      @ 2022-12-24 22:28:23

      /贪心策略: 分行列,找到分开学生最多的一条过道/

      /*贪心策略:
      分行列,找到分开学生最多的一条过道*/
      #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
      上传者