解题报告|USACO 2016 February Contest, Silver Problem 2. Load Balancing
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。
样例输入: 7 7 3 5 5 7 13 3 1 11 7 5 3 9 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). 代码实现:
【解题报告|USACO 2016 February Contest, Silver Problem 2. Load Balancing】#include
#include
#include
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;
}
推荐阅读
- Filecoin挖矿投资报告
- c#常用网址记录
- 【李海峰DISC人际关系训练营学习报告】紫檀东莞班毕业典礼
- 坚守与追求
- 叮咚~您有一份GitHub2020年度报告待查收
- PPT学习第二天之年度总结报告的设计思路
- 【JS 逆向百例】吾爱破解2022春节解题领红包之番外篇 Web 中级题解
- 网红端到端测试神器Cypress开箱试用报告
- 关于“张”姓的历史和现状研究报告
- 2018年读书、观影总结报告