zoukankan      html  css  js  c++  java
  • 牛客小白月赛4 A 三角形

    题面:

    链接:https://www.nowcoder.com/acm/contest/134/A
    来源:牛客网
    
    题目描述 
    铁子从森林里收集了n根木棍,她开始将它们按顺序的排成一排,从左到右依次为1到n,她回想起
    在数学课上老师教她的三角形知识,她开始从这些木棍中间找三根木棍来组成一个周长最大的三角形,
    这时她的兄弟顺溜偷偷的溜了过来,偷走了第i根木棍,现在她想知道现在能够组成周长最大的三角形
    的周长是多少?
    输入描述:
    第一行两个整数n和q。(1 ≤ n, q ≤ 105)
    第二行n个整数表示第i根木棍的长度ai。(1 ≤ ai ≤ 109)
    接下来q行,每行一个整数表示被顺溜偷走的木棍编号。注意每行的事件是独立的,也就是说每一次操作都是对于原来的n根木棍进行的。
    
    输出描述:
    对于每个询问输出一行表示答案,如果删除木棍后无法组成三角形则输出 -1 。
    示例1
    输入
    复制
    6 2
    1 2 3 4 5 6
    6
    5
    输出
    复制
    12
    13

    题解+AC代码

    首先将木棍按长度排序,可以确定的是可以组成的最大三角形的三根木棍就是连着的三个如果偷走的木棍不是这三根木棍中的其中一个,那么答案显然,否则分类处理一下。
    #include<iostream>
    #include<cstring>
    #include<cstdbool>
    #include<algorithm>
    using namespace std;
    int n, p;
    struct node
    {
        long long x, y;
    }a[100005],b[100005];
    bool com(node p, node q)
    {
        return p.y > q.y;
    }
    int main()
    {
        while (cin >> n >> p)
        {
            for (int i = 0; i < n; ++i)
            {
                cin >> a[i].y;
                a[i].x = i+1;
            }
            for (int i = 0; i < n; ++i)
                b[i] = a[i];
            sort(b, b + n,com);
            int ans = 0,ant = 1, off = 0;
            if (n < 4)
                ant = 0;
            while (p--)
            {
                cin >> ans;
                long long nod[5];
                if (ant)
                {
                    int flag = 1;
                    for (int i = 0; i < n ; ++i)
                    {
                        if (b[i].x != ans)
                        {
                            nod[flag] = b[i].y;
                            ++flag;
                            if (flag == 4)
                            {
                                if (nod[1] < nod[2] + nod[3])
                                {
                                    off = 1;
                                    break;
                                }
                                else
                                {
                                    nod[1] = nod[2];
                                    nod[2] = nod[3];
                                    nod[3] = 0;
                                    flag = 3;
                                }
                            }
                        }
                    }
                }
                if (ant&&off)
                    cout << nod[1] + nod[2] + nod[3] << endl;
                else
                    cout << -1 << endl;
                
            }
        }
        return 0;
    }

    一不小心,写了69行,太长了,我不开心。等我看完代码简洁之道再优化吧。

  • 相关阅读:
    Windows下查看某个端口被哪个服务占用
    win8调出右侧菜单栏
    testlink+vertrigoServ搭建测试用例管理系统
    JMeter+Ant+Jenkins
    测试中的基本概念
    测试与开发的关系
    Windows 7 sometimes breaks FTP connections on Java 7 if firewall is enabled.
    在博霞路22号(浦东软件园祖冲之园)上班,党组织关系可以转到哪里?抬头是什么?
    Photoshop软件破解补丁安装方法
    Apache JMeter HTTPS(S) Test Script Recorder
  • 原文地址:https://www.cnblogs.com/cattree/p/9195888.html
Copyright © 2011-2022 走看看