题目链接:http://codeforces.com/problemset/problem/589/B
题目大意:告诉你n 个矩形,知道矩形的长度和宽度(长和宽可以互换),每个矩形的长度可以剪掉一部分,宽度也同样,求出可以得到多少个一样(每个矩形的长相等,宽也相等)的矩形,使得面积之和最大,并输出长和宽。
解题思路:将每个矩形的长和宽都存到一个结构体数组内,对矩形的长进行排序,因为最终结果的长一定是某个矩形的长,宽也一定是某个矩形的宽,所以我们枚举长,然后将长大于等于该长度的矩形的宽加入到一个向量中,再对该向量进行排序,再对宽度进行枚举,找到最大值即可。
详见代码:
1 #include<iostream>
2 #include<cstdio>
3 #include<vector>
4 #include<algorithm>
5 #include<cstring>
6 using namespace std;
7 typedef long long ll;
8 const int maxn=4005;
9 struct node{
10 ll l,w;
11 bool operator<(const node& a)const
12 {
13 return l<a.l; //长从小到大排
14 }
15 }st[maxn];
16 int n;
17
18 int main()
19 {
20 cin>>n;
21 ll a,b;
22 for(int i=0;i<n;i++)
23 {
24 cin>>a>>b;
25 if(a<b) swap(a,b);
26 st[i].l=a,st[i].w=b;
27 }
28 sort(st,st+n);
29 ll ans=0,l,w;
30 vector<ll> k;
31 for(int i=0;i<n;i++)
32 {
33 k.clear();
34 for(int j=i;j<n;j++)
35 k.push_back(st[j].w); //将长度大于等于st[i].l的矩形的宽度加入到向量
36 sort(k.begin(),k.end()); //宽度从小到大排
37 for(int j=0;j<k.size();j++)
38 {
39 ll temp=(ll)(st[i].l*k[j]*(k.size()-j));
40 if(temp>ans)
41 {
42 ans=temp;
43 l=st[i].l;
44 w=k[j];
45 }
46 }
47 }
48 cout<<ans<<endl<<l<<" "<<w<<endl;
49 return 0;
50 }