- 题意: 给出一堆矩形,你要构造出一个矩形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
";
else cout << ans/2 << ".5
";
return 0;
}
脑子抽掉,一直在用面积排序...
由于只要保持小数点一位,直接ll跑面积,最后手工除2