牛客小白月赛4 20180616 A

题目大意

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

分析

贪心题,可将其排序,当在不占用不能用的位置时,且最长边<剩下两条边之和,则为三角形,且在求最大值,故排序,从大往小刷,这样可搞出答案,时间:15ms。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
long long n,m,x;
struct node{
    long long a,b;
}al[1000001];
bool cmp(node x,node y){
    return x.a>y.a;
}
long long doing(){
    for(long long i=1;i<=n;i++){
        long long q1=i,q2=i+1,q3=i+2;
        if(al[i].b==x){
            q1++;
            q2++;
            q3++;
        }
        else if(al[i+1].b==x){
            q2++;
            q3++;
        }
        else if(al[i+2].b==x) q3++;
        if(q3>n) continue;
        if(al[q1].a<al[q2].a+al[q3].a) return al[q1].a+al[q2].a+al[q3].a;
    }
    return -1;
}
signed main(){
    scanf("%lld%lld",&n,&m);
    for(long long i=1;i<=n;i++){
        al[i].b=i;
        scanf("%lld",&al[i].a);
    }
    sort(al+1,al+1+n,cmp);
    for(long long i=1;i<=m;i++){
        scanf("%lld",&x);
        long long gg=doing();
        printf("%lld\n",gg);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sjzezwzy/article/details/80715557