牛客小白赛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 <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define ls (r<<1)
#define rs (r<<1|1)
#define debug(a) cout << #a << " " << a << endl
using namespace std;
typedef long long ll;
const ll maxn = 1e5+10;
const ll mod = 998244353;
const double pi = acos(-1.0);
const double eps = 1e-8;
struct node {
    ll id, num;
};
bool cmp( node p, node q ) {
    return p.num > q.num;
}
node a[maxn];
int main() {
    ios::sync_with_stdio(0);
    ll n, m, x;
    cin >> n >> m;
    for( ll i = 0; i < n; i ++ ) {
        cin >> a[i].num;
        a[i].id = i+1;
    }
    sort(a,a+n,cmp);
    while( m -- ) {
        cin >> x;
        ll cnt = 0, ans = 0;
        bool flag = false;
        for( ll i = 0; i < n; i ++ ) {
            if( a[i].id != x ) {
                ans += a[i].num;
                cnt ++;
            } 
            if( cnt == 3 ) {
                if( a[i].num + a[i-1].num > a[i-2].num ) {
                    cout << ans << endl;
                    flag = true;
                    break;
                } else {
                    ans -= a[i-2].num, cnt --;
                }
            }
        }
        if( !flag ) {
            cout << -1 << endl;
        }
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/l609929321/p/9532019.html