题目见此链接Codeforces589B Layer Cake
题目大意:
主人公要堆砌一个多层的蛋糕,而每一层的蛋糕都将是一个正方形,而每层的正方形蛋糕都是由同一个型号的小蛋糕拼成的(每层的正方形也都是一个规格的)。比如:小蛋糕的规格是width*length(蛋糕的高度都是单位1),那么大正方形的规格便是width*length,由此也可以知道每层大蛋糕需要的小蛋糕数量是num = width*length。同时大蛋糕也可以切成小蛋糕,比如12*5规格可以切成6*4规格,以满足种类扩充。
*具体思路:
1)先规定输入的不同型号蛋糕的长和宽,再将蛋糕放在数轴上(蛋糕的宽放置在数轴上)
2)对所有蛋糕排序:以蛋糕的宽度为标准,从大到小排列
3)从1到n个蛋糕开始遍历,每次选i-th个蛋糕的宽作为之后统一标准的蛋糕的宽度标准
4)对于其余蛋糕的选取,只需要考虑第i 个之前的蛋糕类型就可以,也就是宽度比标准型大的蛋糕
5)每次对前i-1个蛋糕进行以高度递减的重排,逐次进行抽取
以下是代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 4000 + 2;
struct Point{int first, second;};
Point cake_type[maxn];
bool camp_1(Point& lhs, Point& rhs) {return lhs.first > rhs.first;}
bool camp_2(Point& lhs, Point& rhs) {return lhs.second > rhs.second;}
int main(int argc, const char * argv[]) {
// insert code here...
int n;
while (cin >> n) {
for (int i = 1; i <= n; i++) {
cin >> cake_type[i].first >> cake_type[i].second;
if (cake_type[i].first > cake_type[i].second)
swap(cake_type[i].first, cake_type[i].second);
}
sort(cake_type + 1, cake_type + n + 1, camp_1);
long long int max = (long long)cake_type[1].first*(long long)cake_type[1].second;//初始化max
long long int wide_a = cake_type[1].first, high_b = cake_type[1].second;//初始化标准长宽
for (int i = 1; i <= n; i++) {
sort(cake_type + 1, cake_type + i, camp_2);//前段重排
int j = 1;
while (j < i) {
long long int temp_b = min(cake_type[i].second, cake_type[j].second);
long long int temp = temp_b*(j + 1)*(long long)cake_type[i].first;
if (temp > max) {
max = temp;
wide_a = cake_type[i].first;
high_b = cake_type[j].second;
}
j++;
}
}
cout << max << "\n" << wide_a << " " << high_b << endl;
}
return 0;
}
AC 800ms/0kb