cf 1486B Eastern Exhibition
传送门:https://codeforces.com/contest/1486/problem/B
根据题意可知,已知条件就是在一个二维平面上,你(和你朋友)拥有的所有房子的坐标,
目的让你选出一个或若干个坐标作为场地,该坐标距离所有房子的距离之和最小。
有一个规律,即当n(房子的个数)为奇数时,最佳场地的个数ans必定为1:
{
n==1时,显然ans=1;
n==3时,任意两个房子之间的最佳场地可能有一个或若干个,这时候把第三个房子算上,若干个点中只有一个距离它最近的点,即是最佳场地;
n>=5时,以此类推…
}
现在只剩n为偶数的情况,我们要取的是距离所有房子最近的坐标,也就是这个坐标在所有房子的中间,当然这个中间不一定是一个准确的点,所以为了找中间,我们先找到偏向于中间的房子,再具体点就是找中间的横纵坐标。为此,我们将所有房子的横纵坐标分别装在两个vector里,进行sort排序,接着找到两组中位数,共四个数分别为x1、x2、y1、y2,之后在坐标上作出这四条线,它们围出来的空间所包含的点数,即是ans的值,共有三种情况(“十”形、“十十”形、“井”形)。
最后附上AC代码:
#include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n; cin>>n; vector<long long>x; vector<long long>y; for(int i=0;i<n;i++) { long long nx,ny; cin>>nx>>ny; x.push_back(nx); y.push_back(ny); } if(n%2==1) { cout<<1<<endl; } else { long long x1,x2,y1,y2; sort(x.begin(),x.end()); sort(y.begin(),y.end()); x1=x[(n/2)-1]; x2=x[(n/2)]; y1=y[(n/2)-1]; y2=y[(n/2)]; long long ans=(x2-x1+1)*(y2-y1+1); cout<<ans<<endl; } } return 0; }

浙公网安备 33010602011771号