CodeForces

题目链接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 }
原文地址:https://www.cnblogs.com/zjl192628928/p/9403769.html