平衡 balance
程序员文章站
2022-05-25 15:42:25
题面 草地上有 N 头牛,坐标分别为(x1,y1)…(xn,yn),(1≤N≤1000,坐标值都是正的奇数,其不超过 1,000,000)。 现在需要划一条 x 轴和一条 y 轴,值为正的偶数,将草地分成四个区域。为了平衡,现在希望每个区域上牛的数量尽量平均。对于某个划分方案,设M 为四个区域中牛的 ......
题面
草地上有 n 头牛,坐标分别为(x1,y1)…(xn,yn),(1≤n≤1000,坐标值都是正的奇数,其不超过 1,000,000)。
现在需要划一条 x 轴和一条 y 轴,值为正的偶数,将草地分成四个区域。为了平衡,现在希望每个区域上牛的数量尽量平均。对于某个划分方案,设m 为四个区域中牛的数量的最大值。
求一种划分方案,使得 m 值最小。
【输入文件】
第 1 行 1 个整数 n;
接下来 n 行,每行两个正奇数,表示一头牛的坐标。
【输出文件】
共 1 行 1 个整数,表示 m 的最小值。
7 7 3 5 5 7 13 3 11 1 7 5 3 9 1
2
样例图片
思路
对于样例,我们可知其实对于牛的划分,每个牛的位置并不重要,我们只需要知道相对位置就可以进行划分。
所以对于每个点离散化它的坐标,使其呈现出x第几大,y第几大的结构。
再用前缀和模拟求解即可。
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct node{int x,y,numx,numy;}a[1005]; 4 int n,maxn=1,maxm=1,minn=999999,b[1005][1005],sum[1005][1005]; 5 inline bool cmp1(node a,node b){return a.x<b.x;} 6 inline bool cmp2(node a,node b){return a.y<b.y;} 7 int main(){ 8 cin>>n; 9 for (int i=1;i<=n;i++) cin>>a[i].x>>a[i].y; 10 sort(a+1,a+n+1,cmp1); 11 a[1].numx=1; 12 for (int i=2;i<=n;i++) if (a[i].numx==a[i-1].numx) a[i].numx=a[i-1].numx;else a[i].numx=a[i-1].numx+1,maxn++; 13 sort(a+1,a+n+1,cmp2); 14 a[1].numy=1; 15 for (int i=2;i<=n;i++) if (a[i].numy==a[i-1].numy) a[i].numy=a[i-1].numy;else a[i].numy=a[i-1].numy+1,maxm++; 16 for (int i=1;i<=n;i++) b[a[i].numx][a[i].numy]=1; 17 for(int i=1;i<=maxn;i++) for(int j=1;j<=maxm;j++) sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+b[i][j]; 18 for(int i=1;i<=maxn;i++)for(int j=1;j<=maxm;j++) minn=min(minn,max(max(sum[i][j],sum[i][maxm]-sum[i][j]),max(sum[maxn][j]-sum[i][j],sum[maxn][maxm]-sum[i][maxm]-sum[maxn][j]+sum[i][j]))); 19 cout<<minn<<endl; 20 return 0; 21 }
上一篇: Linux常用命令总结——vi编辑器