贪心贪心......
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=300005;
int h[N],w[N],n;
struct rec{
int h,w;
}a[N];
int sum;
bool check(int H){
int num=0,W=0;
priority_queue<int,vector<int>,greater<int>>q;
for(int i=0;i<n;++i){
if(a[i].h>H&&a[i].w>H) return false;//H不可能
else if(a[i].w<=H&&H<a[i].h){//必须liedown
++num;
W+=a[i].h;
}else if(a[i].h<=H&&H<a[i].w){//必须竖着
W+=a[i].w;
}else if( a[i].h<=H && a[i].w<=H ){ //有可能放倒更优的 加入队列
q.push(a[i].h-a[i].w);
W+=a[i].w;
}
}
if(num>n/2) return false;
for(int i=0; i<n/2-num && q.size(); ++i){
if(q.top()>=0) break;//a[i].h>a[i].w后 不能再liedown
W+=q.top();
q.pop();
}
sum=W*H;
return true;
}
int main(){
scanf("%d",&n);
int H=0;
for(int i=0;i<n;++i){
scanf("%d%d",&a[i].w,&a[i].h);
H=max(max(a[i].h,a[i].w),H);//这里取最大的可能的值!
}
int ans=1000000000;
//sort(a,a+n);
for(int i=1;i<=H;++i){//枚举最大高度
if(!check(i)) continue;
ans=min(ans,sum);
}
printf("%d\n",ans);
return 0;
}