牛客网 小白赛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\n",solve());
    }
}

猜你喜欢

转载自www.cnblogs.com/Roni-i/p/9193666.html