仅过#1,求助
查看原帖
仅过#1,求助
273056
splendid_followers楼主2021/12/24 17:03

因为每条线需要切割尽可能多的同学

所以每条线必定经过至少一对同学

#include<bits/stdc++.h>
using namespace std;
int m,n,k,l,d;
struct jttx
{
	int x,y,x2,y2;
}
s[10000];//交头接耳的同学 
struct road//分割线 
{
	int xy,sum;
}
h[10000],x[10000];//横线和竖线 
void sousuo(int dq)//搜索(算是) 
{
	if(s[dq].x==s[dq].x2)//如果两个同学中间夹得是列(在同一行) 
	{
		for(int i=1;i<=d;i++)//枚举每对交头接耳的同学 
		{
			if(s[i].y==s[dq].y&&s[i].y2==s[dq].y2)
			{
				x[dq].sum++; 
			}
		}
		x[dq].xy=s[dq].y;//存储坐标 
	}
	else//在同列即枚举行 
	{
		
		for(int i=1;i<=d;i++)
		{
			if(s[i].x==s[dq].x&&s[i].x2==s[dq].x2)
			{
				h[dq].sum++;
			}
		}
		h[dq].xy=s[dq].x;
	}
}
bool cmp(road a,road b)//贪心 
{
	if(a.sum!=b.sum)//不同人数将大的向前 
	{
		return a.sum>b.sum;
	}
	else
	{
		return a.xy<b.xy;//同人数将在前的往前 
	}
}
int main()
{
	cin>>m>>n>>k>>l>>d;
	for(int i=1;i<=d;i++)
	{
		int x,y,x2,y2;
		cin>>x>>y>>x2>>y2;
		if(x==x2)
		{
			s[i].x=x;s[i].x2=x;
			s[i].y=min(y,y2);s[i].y2=max(y,y2);
		}
		else
		{
			s[i].y=y;s[i].y2=y;
			s[i].x=min(x,x2);s[i].x2=max(x,x2);
		}
	}
	for(int i=1;i<=d;i++)
	{
		sousuo(i);//枚举每对 
	}
	sort(h+1,h+1+d,cmp);sort(x+1,x+1+d,cmp);//贪心 
	for(int i=1;i<=k;i++)
	{
		cout<<h[i].xy<<" ";
	}
	cout<<endl;
	for(int i=1;i<=l;i++)
	{
		cout<<x[i].xy<<" ";
	}
}
2021/12/24 17:03
加载中...