2019-2020 ICPC, Asia Jakarta Regional Contest H - Twin Buildings

Day1

  • 题意: 给出一堆矩形,你要构造出一个矩形R,使能在这堆矩形上至少能造出来两个R.求R的最大面积
  • 思路: 先对矩形的长边进行排序,然后从后向前遍历,则可以保证后面的长边肯定小于前面的长边,存下前面遇到短边最长的矩形,然后跟当前的矩形组合更新答案.
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;
 
const int N =  1e5+10;
 
struct node{
    ll l,r;
    bool operator <(const node b){
        if(l != b.l) return l > b.l;
        return r > b.r;
    }
}a[N];
int n;
int main(){
    ios::sync_with_stdio(0);
    cin >> n;
    ll ans = 0;
    for(int i=1;i<=n;++i){
        cin >> a[i].l >> a[i].r;
        ans = max(ans,a[i].l*a[i].r);
        if(a[i].l < a[i].r) swap(a[i].l , a[i].r);
    }
    sort(a+1,a+1+n);
    ll fuck = 2.0, cr = 1;
    for(int i=2;i<=n;++i){
        ans = max(min(a[i].r,a[cr].r)*a[i].l*fuck,ans);
        if(a[i].r>a[cr].r) cr = i;
    }
    if(ans%2==0)    cout << ans/2 << ".0\n";
    else cout << ans/2 << ".5\n";
    return 0;
}

脑子抽掉,一直在用面积排序...
由于只要保持小数点一位,直接ll跑面积,最后手工除2

猜你喜欢

转载自www.cnblogs.com/xxrlz/p/11756282.html