-
题意:有\(2n\)个数,要凑\(n\)个坐标出来,使得这些坐标全部落在一个矩形内部,问你最小的矩形面积是多少.
-
题解:这种题一般都是将横纵坐标分开看,首先,矩形的面积=\((max(x)-min(x))\)*\((max(y)-min(y))\).对坐标排序,根据最值原理,“和一定,差大积小”,所以我们可以固定\(x\)的最大和最小坐标,然后去找\(y\)的最小的最大和最小值之差,我们可以在\([2,n-1]\)中找,因为最小的话,一定是选\(a[i]\)和\(a[i-n+1]\).直接线性就能找出来.
还有一种情况,当最小坐标是\(x\),最大坐标是\(y\)时,此时左边界和上边界已经确定,那么最小面积自然就是\((a[n]-a[1])*(a[2*n]-a[n+1])\).
-
代码:
#include <bits/stdc++.h> #define ll long long #define fi first #define se second #define pb push_back #define me memset #define rep(a,b,c) for(int a=b;a<=c;++a) #define per(a,b,c) for(int a=b;a>=c;--a) const int N = 1e6 + 10; const int mod = 1e9 + 7; const int INF = 0x3f3f3f3f; using namespace std; typedef pair<int,int> PII; typedef pair<ll,ll> PLL; ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;} ll lcm(ll a,ll b) {return a/gcd(a,b)*b;} int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int n; cin>>n; vector<ll> a(2*n+1); rep(i,1,2*n){ cin>>a[i]; } sort(a.begin(),a.end()); ll ans=(a[n]-a[1])*(a[2*n]-a[n+1]); rep(i,2,n){ ans=min(ans,(a[2*n]-a[1])*(a[n+i-1]-a[i])); } cout<<ans<<'\n'; return 0; }