1. 程式人生 > >牛客小白月賽4 20180616 A

牛客小白月賽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; }