Codeforces 589B Layer Cake(两次排序)

题目地址:http://codeforces.com/problemset/problem/589/B

思路:设长<=宽,将各物体按长从小到大排序。从后向前枚举长,同时将宽加入并排序。则对于位置 j 的宽,有 num-j 物体宽大于它(由于长从小到大枚举,保证新加入物体的长不大于当前物体的长),则体积 a[i].r*b[j]*(num-j) 每次取最大即可。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debu
using namespace std;
const int maxn=4000+50;
typedef long long LL;
struct Node
{
    int r,c;
};
int b[maxn];
Node a[maxn];
int cmp(Node a,Node b)
{
    if(a.r==b.r) return a.c<b.c;
    else return a.r<b.r;
}
int main()
{
#ifdef debug
    freopen("in.in","r",stdin);
#endif // debug
    int n;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        a[i].r=min(x,y);
        a[i].c=max(x,y);
    }
    sort(a,a+n,cmp);
    LL ans=0;
    int num=0,ansr,ansc;
    for(int i=n-1; i>=0; i--)
    {
        b[num++]=a[i].c;
        sort(b,b+num);
        for(int j=0; j<num; j++)
        {
            LL tmp=(LL)a[i].r*b[j]*(num-j);
            if(tmp>ans)
            {
                ans=tmp;
                ansr=a[i].r;
                ansc=b[j];
            }
        }
    }
    printf("%I64d\n",ans);
    printf("%d %d\n",ansr,ansc);
    return 0;
}
时间: 2024-12-22 23:52:26

Codeforces 589B Layer Cake(两次排序)的相关文章

CodeForces 589B Layer Cake (暴力)

题意:给定 n 个矩形是a*b的,问你把每一块都分成一样的,然后全放一块,高度都是1,体积最大是多少. 析:这个题,当时并没有完全读懂题意,而且也不怎么会做,没想到就是一个暴力,先排序,先从大的开始选,如果大,那么数量少,如果小,数量就多, 用一个multiset来排序,这样时间复杂度会低一点,每一个都算一下比它的大矩阵的数量,然后算体积,不断更新,最大值. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #i

CodeForce 589B Layer Cake

Layer Cake Dasha decided to bake a big and tasty layer cake. In order to do that she went shopping and bought n rectangular cake layers. The length and the width of the i-th cake layer were ai and bi respectively, while the height of each cake layer

Codeforces 439D Devu and his Brother(排序)

题目链接:Codeforces 439D  Devu and his Brother 题目大意:Devu和他的哥哥互相深爱着对方,我确信他们是搞基的,为此我还去查了一下Devu是男人名还是女人名,但是后来发现His Brother,所以可以证明,他们就是搞基的.题目很简单,父亲给了他们两个人分别一个数组.但是Devu希望自己最小的数都可以不必哥哥最大的数小,现在对数组中的数有两种操作,一种是加1,一种是减1,问最少进行几次操作可以使得两个数组满足要求. 解题思路:将两个数组合并在一起,然后排序,

面试题 17:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的. 两个指针指向两个链表的头结点,取其中值小的作为新链表的头结点,和之前的结点串联,如此递归. 注意用例: 两个链表都为null: 其中一个链表为null: 两个链表有多个结点,有相同的值,不同的值. package offer; /*面试题 17:合并两个排序的链表 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的.*/ public class Problem17 { st

合并两个排序的链表(剑指offer)

合并两个排序的链表 参与人数:1527时间限制:1秒空间限制:32768K 通过比例:27.96% 最佳记录:0 ms|8552K(来自  牛客708854号) 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目链接:http://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337?rp=1&ru=/ta/coding-interviews&qru=/ta/codin

面试题17:合并两个排序的链表

ListNode类(结点类) 1 package leetcode.utilities; 2 3 public class ListNode { 4 public int val ; 5 public ListNode next ; 6 public ListNode(int val) { 7 // TODO Auto-generated constructor stub 8 this.val = val; 9 this.next = null ; 10 } 11 //打印链表 12 publi

HashMap的两种排序方式

Map<String, Integer> map = new HashMap<String, Integer>(); map.put("d", 2); map.put("c", 1); map.put("b", 1); map.put("a", 3); List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.

比较两个排序好的文件的方法—— comm

导读 Linux 中的 comm 命令可以让用户按行比较两个已经排序好的文件.在本教程中,我们将使用一些浅显易懂的例子来讨论这个命令行工具.在开始之前,请注意,本教程中提到的所有例子都已经在 Ubuntu 16.04LTS 版本中测试过.. 下面的例子将会告诉你 comm 命令是如何工作的.. 如何使用 comm比较两个排序好的文件 要使用comm 命令比较两个排序好的文件,只需要把它们的名字作为comm 命令的参数.下面是通常的语法: comm [name-of-first-file] [na

面试题:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增的. 例如: /*合并两个排序的链表*/ /* 链表节点定义如下: struct ListNode { int _data; ListNode* _next; }; */ ListNode* MergeList(ListNode* pHead1, ListNode* pHead2) { if (pHead1 == NULL) //链表1为空链表 { return pHead2; } else if (pHead2 == NU