欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

平衡 balance

程序员文章站 2023-10-17 15:50:35
题面 草地上有 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 的最小值。

平衡 balance
7
7 3
5 5
7 13
3 11
1 7
5 3
9 1
输入
平衡 balance
 2
输出

样例图片

平衡 balance

思路

对于样例,我们可知其实对于牛的划分,每个牛的位置并不重要,我们只需要知道相对位置就可以进行划分。

所以对于每个点离散化它的坐标,使其呈现出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 }