Codeforces Round #500 (Div. 2) [based on EJOI] C. Photo of The Sky (思维)

Codeforces Round #500 (Div. 2) [based on EJOI] C. Photo of The Sky  (思维)

  • 题意:有\(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;
    }
    
上一篇:2021苹果官方iCloud迁移照片到Google Photo教程


下一篇:TK中遇到无法导入其他图片格式问题