题目大意:给定n块蛋糕,高为1,长宽输入,问最大的相同体积的体积和是多少。
思路:按长边升序排列,相等时短边升序。枚举每个长和宽,每次枚举时从长边对应的最短宽边开始,对当前位置以后的宽边进行重新排序,则比当前的长和宽大于等于的蛋糕个数就可以确定,体积和也可以确定。
ps:刚开始暴力,显然超时,给了三重循环,,,
#include <bits/stdc++.h>
using namespace std;
struct cake
{
long long l , w;
}arr[4001] , A[4001];
int ans[4001];
int n;
bool cmp(cake a , cake b)
{
return a.w < b.w;
}
bool cmp2(cake a , cake b)
{
if(a.l == b.l) return a.w < b.w;
return a.l < b.l;
}
int main()
{
while(scanf("%d" , &n) != EOF)
{
int t1 , t2 ;
for(int i = 0 ; i < n ; i ++)
{
scanf("%d %d" , &t1 , &t2);
if(t1 > t2) swap(t1 , t2);
arr[i].w = t1 , arr[i].l = t2;
}
sort(arr , arr + n , cmp2);
long long maxx = -1;
long long sum = 0;
int ml = -1 , mw = -1 ;
memcpy(A , arr , sizeof(arr));
for(int i = 0 ; i < n ; i ++)
{
memcpy(arr , A , sizeof(A));
sort(arr + i , arr + n , cmp);
for(int j = i ; j < n ; j ++)
{
sum = A[i].l * arr[j].w * (n - j) ;
if(sum > maxx)
{
maxx = sum ;
ml = A[i].l;
mw = arr[j].w;
}
}
}
printf("%I64d\n%d %d\n" , maxx , ml , mw);
}
return 0;
}