您的位置:首页 > Web前端

USACO 2016 February Contest, Silver Problem 2. Load Balancing

2016-08-07 11:09 483 查看
FJ的N头牛都站在FJ的二维农场上的一些明显的坐标(x1,y1)...(xn,yn)上(1<=N<=1,000,并且xi和yi都是正奇数,大小不会超过1,000,000)。FJ想以建造一条很长(实际上是无限长)的南北向的栅栏的方式来分割他的农场,这个栅栏表示的直线符合直线方程(或者说一次函数)x=a(a是一个偶数,请确保FJ不会将栅栏穿过任何一头牛)。FJ同时还想建造另一条很长(实际上也是无限长)的东西向的栅栏,这个栅栏表示的直线同样满足直线方程y=b,其中b是一个偶数。这两条栅栏相交于点(a,b),并且这两条栅栏一起将他的农场分成四块。
FJ想选择a和b使得出现在这四块区域里的牛的个数是“平衡的”,即没有一块区域里有太多的牛。如果使得M是四块区域里牛的数量的最大值,那么FJ想让M最小。请帮助他决定M的最小值。
输入格式 (balancing.in):第一行的输入是一个整数N,下面N行每行包含一只牛的位置,即其的x和y坐标。
输出格式 (balancing.out):只有一行,即最小的M。
样例输入:77 35 57 133 111 75 39 1样例输出:2================================================================题意和铜牌组一样,只是本题的数据范围变成了 1<=n<=1000,显然再像之前一样枚举会超时.因此我们要换另外一种方式来枚举.如下图所示.

 我们可以先把所有的点按 x 轴进行排序.这样一来,由于 x 已经有序,我们考虑另一种思路.假设我们已选定点 i,不妨将这些点分为两个集合,yj<=yi 的分为一个,其余 yj>yi 的分为另一个.即,在上图中的例子里,对于选定点 A 的情况,{D,F,A,G}是一组,{B,C,E}是一组.我们假定 yi 就是我们要求的 y 轴.每次,在两个集合中分别选择 x 最小的点,取两者中更小者作为当前假定 x 轴.如此,因为我们已进行过预处理,分别计算四个区域中点的个数也就容易实现.计算完后取最小值,并将所选的 x 最小点移出集合即可.时间复杂度约为O(nlog2n+n^2).代码实现:
#include<algorithm>
#include<fstream>
#include<iostream>
using namespace std;
const int maxn = 1010;
const int inf = 0x7fffffff;
struct Tnode {
int x, y;
bool operator <(const Tnode s)const {
return this->x < s.x;
}
} pos[maxn];
ifstream fin("balancing.in");
ofstream fout("balancing.out");
int n;
int main() {
fin >> n;
for(int i = 0; i != n; ++i)fin >> pos[i].x >> pos[i].y;
sort(pos, pos + n);
int ans = n;
for(int i = 0; i != n; ++i) {
Tnode low[maxn], high[maxn];
int lowCnt = 0, highCnt = 0;
for(int j = 0; j != n; ++j)
if(pos[j].y <= pos[i].y)low[lowCnt++] = pos[j];
else high[highCnt++] = pos[j];
int lowI = 0, highI = 0;
while(lowI < lowCnt || highI < highCnt) {
int nowX = inf;
if(lowI != lowCnt)nowX = min(nowX, low[lowI].x);
if(highI != highCnt)nowX = min(nowX, high[highI].x);
for(; lowI != lowCnt && low[lowI].x == nowX; ++lowI);
for(; highI != highCnt && high[highI].x == nowX; ++highI);
ans = min(ans, max(max(lowI, lowCnt - lowI), max(highI, highCnt - highI)));
}
}
fout << ans << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: