zoukankan      html  css  js  c++  java
  • [CF733D]Kostya the Sculptor(贪心)

    题目链接:http://codeforces.com/contest/733/problem/D

    题意:给n个长方体,允许最多两个拼在一起,拼接的面必须长宽相等。问想获得最大的内切圆的长方体序号是多少。最多拼2个,可以不拼。

    最大内切圆与最短的边有关系,在读入的时候做只取一个的情况,接下来按照边长从大到小排序,之后按照最大边依次排序,取相邻的两个拼接在一起看看是否更大。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 typedef struct S {
     5     int x, y, z, id;
     6     S(){}
     7     S(int xx, int yy, int zz) {
     8         if(xx < yy) swap(xx, yy);
     9         if(xx < zz) swap(xx, zz);
    10         if(yy < zz) swap(yy, zz);
    11         x = xx; y = yy; z = zz;
    12     }
    13     bool operator <(const S b) const {
    14         if(x == b.x) {
    15             if(y == b.y) return z > b.z;
    16             return y > b.y;
    17         }
    18         return x > b.x;
    19     }
    20     bool operator ==(const S b) const {
    21         return x == b.x && y == b.y && z == b.z;
    22     }
    23     S operator +(const S b) const {
    24         return S(x,y,z+b.z);
    25     }
    26 }S;
    27 typedef pair<int,int> pii;
    28 const int maxn = 100100;
    29 int n, ret, id1, id2;
    30 S s[maxn];
    31 
    32 int main() {
    33     // freopen("in", "r", stdin);
    34     int x, y, z;
    35     while(~scanf("%d", &n)) {
    36         ret = 0; id2 = -1;
    37         for(int i = 1; i <= n; i++) {
    38             scanf("%d%d%d",&x,&y,&z);
    39             s[i] = S(x, y, z);
    40             s[i].id = i;
    41             if(ret < s[i].z) {
    42                 ret = s[i].z;
    43                 id1 = i;
    44             }
    45         }
    46         sort(s+1, s+n+1);
    47         for(int i = 1; i <= n - 1; i++) {
    48             if(s[i].x==s[i+1].x&&s[i].y==s[i+1].y) {
    49                 S t = s[i] + s[i+1];
    50                 if(ret < t.z) {
    51                     ret = t.z;
    52                     id1 = s[i].id; id2 = s[i+1].id;
    53                     if(id1 > id2) swap(id1, id2);
    54                 }
    55             }
    56         }
    57         if(id2 == -1) {
    58             printf("%d
    %d
    ", 1, id1);
    59         }
    60         else {
    61             printf("%d
    %d %d
    ", 2, id1, id2);
    62         }
    63     }
    64     return 0;
    65 }
  • 相关阅读:
    【IDDFS】Power Calculus
    【A*/K短路】 [USACO08MAR]Cow Jogging G
    P1880 [NOI1995]石子合并
    【区间DP】[USACO16OPEN]248 G
    【树上背包】P1273 有线电视网
    【分组背包】[BJOI2019]排兵布阵
    DP学习笔记——背包专题
    【思维/构造】D
    【线段树+扫描线】P5490 【模板】扫描线
    【最小生成树】畅通工程再续 HDU
  • 原文地址:https://www.cnblogs.com/kirai/p/6020119.html
Copyright © 2011-2022 走看看