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
    【代码】:

    #include<string>
    #include<cstdlib>
    #include<cmath>
    #include<iostream>
    #include<cstring>
    #include<set>
    #include<queue>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<cctype>
    #include<stack>
    #include<sstream>
    #include<list>
    #include<assert.h>
    #include<bitset>
    #include<numeric>
    using namespace std;
    
    typedef long long ll;
    typedef unsigned long long ULL;
    typedef pair<int,int> P;
    const int INF = 0x3f3f3f3f;
    const ll LNF = 1e18;
    const int maxn = 1e5 + 100;
    const int maxm = 100;
    const double PI = acos(-1.0);
    const double eps = 1e-8;
    //const int dx[] = {-1,1,0,0,1,1,-1,-1};
    //const int dy[] = {0,0,1,-1,1,-1,1,-1};
    const int dx[] = {-1,1,0,0};
    const int dy[] = {0,0,1,-1};
    
    const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    const int dir[6][3]={ {0,0,1},{0,0,-1},{-1,0,0},{1,0,0},{0,1,0},{0,-1,0} };
    
    ll n,q,p;
    struct node
    {
        ll x,id;
    }a[maxn];
    
    bool cmp(node a, node b)
    {
        return a.x>b.x;      //从最大值开始枚举
    }
    
    ll solve()
    {
        for(ll i=1; i+2<=n; i++)         //i+2最大值不能超过n
        {
            ll k1=i,k2=i+1,k3=i+2;     //模拟指针
            if(a[i].id == p)        { k1++; k2++; k3++;}     //遇到要删除的目标,指针后移
            else if(a[i+1].id == p) { k2++; k3++;      }
            else if(a[i+2].id == p) { k3++;            }
            if(a[k1].x < a[k2].x + a[k3].x) return a[k1].x + a[k2].x + a[k3].x;     //合法返回周长
        }
        return -1;
    }
    int main()
    {
        scanf("%lld%lld",&n,&q);
        for(ll i=1;i<=n;i++)
        {
            a[i].id=i;
            scanf("%lld",&a[i].x);
        }
        sort(a+1,a+n+1,cmp);
        while(q--)
        {
            scanf("%lld",&p);
            printf("%lld
    ",solve());
        }
    }
    
  • 相关阅读:
    定时删除日志文件---linux定时清理日志
    Packagist 镜像使用方法--composer
    laravel 5.5 跨域问题解决方案
    linux服务器上面部署ShowDoc 安装Composer
    shell之批量新增用户脚本(http-basic-auth)
    js转义问题
    js之select三级联动
    《远见》之读书笔记
    Node.js之判断字符串中是否包含某个字符串
    微信小程序之页面传参
  • 原文地址:https://www.cnblogs.com/Roni-i/p/9193666.html
Copyright © 2011-2022 走看看