2019-2020 ICPC, Asia Jakarta Regional Contest H. Twin Buildings
题意:n个矩形,每个矩形长Li,宽Wi,
要在这些矩形里面建两个一毛一样的矩形,两种方式:
1,从n种里面选一种在里面建造两个矩形(肯定选最大的哪个啦)
2,从n种里选两个各在里面建一个矩形(建的矩形长宽都是两个矩形中的最小值)
考虑方法2,
如果要在一个矩形里面建造矩形,新矩形的长和宽都是未知的(就很麻烦就
所以我们通过排序,控制一个变量使他已知(使可建造的矩形宽肯定等于当前矩形,就要排序使遍历他之前的矩形宽都大于等于当前矩形)
为了避免精度损失使用LL。
int n; ll l,w; vector<pii >v; int cmp(pii a,pii b){return a.second>b.second;} int main() { rd(n); ll ans=0; for(int i=0;i<n;++i) { rd(l),rd(w);ans=max(ans,l*w); if(l>w) swap(l,w); v.push_back({l,w}); } sort(v.begin(),v.end(),cmp); //w降序排列,对于如果拿当前枚举到的矩阵和其他一个矩阵组成 //该矩阵前面的矩阵w肯定都大于当前的w //那么从以前的最大的l与当前的矩阵组成俩矩阵 ll mxl=v[0].first; for(int i=1;i<n;++i) { ans=max(ans,v[i].second*min(v[i].first,mxl)*2); mxl=max(mxl,v[i].first); } if(ans%2) printf("%lld.5\n",ans/2); else printf("%lld.0\n",ans/2); //stop; return 0; }