codeforces733D. Kostya the Sculptor 偏序cmp排序,数据结构hash,代码简化

对于n==100。1,1,2或者1,2,2大量重复的形状相同的数据,cmp函数最后一项如果表达式带等于,整个程序就会崩溃

还没有仔细分析std::sort的调用过程,所以这里不是很懂。。,mark以后研究

因为题目让你挑一到两个平行六面体,然后去每个平行六面体长宽高的最小值,然后去求最小值中的最大值

我们很容易想到暴力的做法,如果两个平行六面体能够合并的话,那我们直接计算合并之后的最小值,因为我们知道此时

合并之后再求最小值,它是只增不减的

那么我们就要找到能合并某一个面的所有平行六面体的集合,

这里有一个令人模糊的地方,那就是对于每一个平行六面体,我们选它的哪一个面呢,当然只有三个不同的面

我们发现了以下事实

1,2,3==3,2,1==2,3,1尺寸的平行六面体是同一个东西,但是这个给我们带来了很大的困扰。。

因为我们会把同一个东西当成不同的考虑3遍,而每一遍我们起初还会考虑三个面。。很乱。。

但是仔细一想,我们其实不用考虑1,2和1,3这两个面,因为你叠加这两个平行六面体,只增加次大值或者最大值

最小值没变。。而只有最小值对答案有贡献,所以说我们要让除了最小值的另外两个尺寸构成平面然后去考虑能不能和其他的

平行六面体叠加,增加最小值,从而达到增大对答案贡献的目的

所以我们需要把每个平行六面体的size从小到大排序,然后我们希望对平行六面体整体排序,然后次大值和最大值相等的尽量挨在一起

这样就好处理了,这个就是字典序了,看你侧重哪个元素的优先选取,仔细想想就能懂了

本次代码经验,记得切换目录到源文件根目录,否则会报错。。能用数组索引操作的变量(下标操作)我们就尽量不起别名,用for简单操作

代码:

#include <cstdio>
#include <algorithm>
using namespace std;
int n;
const int maxn=1e5+7;
struct node{
    int a[3];
    int index;
};
bool cmp(node a,node b){
    if(a.a[2]!=b.a[2]){
        return a.a[2]<b.a[2];
    }
    if(a.a[1]!=b.a[1]){
        return a.a[1]<b.a[1];
    }
    // if(a.a[2]!=b.a[2]){
    //     return a.a[2]<b.a[2];
    // }
    return a.a[0]<b.a[0];
    //全部相等的时候因该返回什么
    //目前我是这么理解的
    //如果cmp为真则sort不交换,如果sort为假那我们就交换
    //当完全相等的时候,我认为没有什么必要交换
    //我们应该按照2,1,0的顺序来排列?
    //事实证明有等于号好像不行呢。。

}

node A[maxn];
bool check(int pre,int next){
    node a=A[pre],b=A[next];
    if(a.a[1]==b.a[1]&&a.a[2]==b.a[2]) return true;
    return false;
}
int main(){
    scanf("%d",&n);
    register int i;
    //int temp[3];
    // printf("there1\n");
    for(i=0;i<n;++i){
        scanf("%d%d%d",&A[i].a[0],&A[i].a[1],&A[i].a[2]);
        sort(A[i].a,A[i].a+3);
        A[i].index=i+1;
    }
    // printf("there2\n");
    sort(A,A+n,cmp);
    //debug
    // for(i=0;i<n;++i){
    //     printf("p:%d %d %d\n",A[i].a[0],A[i].a[1],A[i].a[2]);
    // }
    // printf("there3\n");
    int ans,first=1;
    int ans1=-1,ans2=-1;
    for(i=0;i<n;++i){
        // printf("there4 i:%d\n",i);
        int mi=A[i].a[0];
        if(first){
            first=0;
            ans=mi;
            ans1=A[i].index;
            ans2=-1;//第一次初始化的时候更新不全
        }
        else{
            if(mi>ans){
                ans=mi;
                ans1=A[i].index;
                ans2=-1;
            }
        }
        if(i+1<n&&check(i,i+1)){
            int now=A[i].a[0]+A[i+1].a[0];
            mi=min(A[i].a[1],min(A[i].a[2],now));
            if(mi>ans){
                ans=mi;
                ans1=A[i].index;
                ans2=A[i+1].index;
            }
        }
    }
    if(ans2==-1){
        printf("1\n%d\n",ans1);
    }
    else{
        printf("2\n%d %d\n",ans1,ans2);
    }
    return 0;
}
时间: 2024-11-08 08:58:36

codeforces733D. Kostya the Sculptor 偏序cmp排序,数据结构hash,代码简化的相关文章

CF733D Kostya the Sculptor[贪心 排序]

D. Kostya the Sculptor time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Kostya is a genial sculptor, he has an idea: to carve a marble sculpture in the shape of a sphere. Kostya has a frien

Kostya the Sculptor

Kostya the Sculptor 题目链接:http://codeforces.com/problemset/problem/733/D 贪心 以次小边为第一关键字,最大边为第二关键字,最小边为第三关键字排序,每次只需要找次小边和最大边均相同,最小边最大的两项即可. 因为用Python遇到很多问题,切片操作a[i:j]是左闭右开区间[i,j) 代码如下: 1 n = int(input()) 2 a = [] 3 ans,u,v = 0,-1,-1 4 for i in range(n):

Python实现各种排序算法的代码示例总结

Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示例总结,其实Python是非常好的算法入门学习时的配套高级语言,需要的朋友可以参考下 在Python实践中,我们往往遇到排序问题,比如在对搜索结果打分的排序(没有排序就没有Google等搜索引擎的存在),当然,这样的例子数不胜数.<数据结构>也会花大量篇幅讲解排序.之前一段时间,由于需要,我复习了

各种排序算法的代码

1 // ALLKindsOfSorts.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 #include<vector> 7 #include<bitset> 8 9 using namespace std; 10 11 ////////////////////////////////////////所有的排序总结///////////////////

排序算法总结---代码+性能

// data_sort_alg.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "sort_alg.h" #include <iostream> #include <vector> void show(std::vector<int> &a) { std::vector<int>::iterator it=a.begin(); while(it!=a.

二分排序之三行代码

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include<stdio.h>  #include<stdlib.h>  int a[]={10,22,42,51,56,63,78,99,102,118};   int binSearch(int* a, int begin, int end, int k){      int mid = begin + ( (end - begin)>>1 ),index;      index

Datagrid分页、排序、删除代码

<%@ Page language="c#" Codebehind="default.aspx.cs" AutoEventWireup="false" Inherits="datagrid.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD

MySQL源码 数据结构hash

MySQL源码自定义了hash表,因为hash表具有O(1)的查询效率,所以,源码中大量使用了hash结构.下面就来看下hash表的定义: [源代码文件include/hash.h mysys/hash.c] typedef uint my_hash_value_type; typedef uchar *(*my_hash_get_key)(const uchar *,size_t*,my_bool); typedef void (*my_hash_free_key)(void *); type

codeforces 733D Kostya the Sculptor(贪心)

Kostya is a genial sculptor, he has an idea: to carve a marble sculpture in the shape of a sphere. Kostya has a friend Zahar who works at a career. Zahar knows about Kostya's idea and wants to present him a rectangular parallelepiped of marble from w