5.4 每日一题题解

三角形

涉及知识点:

  • 模拟/思维

solution:

  • \(这个题可以暴力也可以巧妙一点的暴力\)

  • \(我看了一下别人的代码,直接暴力就过了,每次询问的时候,找符合条件的最大的三个数\)

  • \(晚上突然想到,根据斐波那契数列数列,不会构造出长度为1e5,而且所有的边都不能构成三角形的样例,所以只要是提前排好序,那么每次找最大值的的时间为O(90),也就是常数\)

  • \(我说一下我的思路:\)

  • \(我是提前把答案预处理出来,就是当我需要删除哪一根木棒的时候,就可以直接输出答案\)

  • \(假设最大的符合条件的三条边是a,b,c那么当我们删除其余任意一条边的时候,答案一定是a + b + c\)

  • \(那么当我们去除a,b,c其中一个木棒的时候,那么我们自己暴力出符合条件的最大值就OK了\)

  • \(注意这个题一定要有long long,注意这个题一定要有long long,注意这个题一定要有long long\)

std:

#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<long long,long long>PII;
long long n,m;
const long long N = 1e5 + 10;
pair<long long,long long> a[N];
long long ans[N];

bool check(long long b,long long c,long long d)
{
    if(a[d].first + a[c].first > a[b].first)
    {
        return true;
    }
    return false;
}

int main()
{
    cin >> n >> m;
    
    for(long long i = 1;i <= n;i ++)
    {
        scanf("%lld",&a[i].first);
        a[i].second = i;
    }
    
    sort(a + 1,a + n + 1,[](pair<long long,long long>p1,pair<long long,long long>p2){
        return p1.first > p2.first;
    });
    
    long long nn = 0;
    
    for(long long i = 1;i <= n - 2;i ++)
    {
        if(check(i,i + 1,i + 2))
        {
            nn = i;
            break;
        }
    }
    
    if(nn == 0)
    {
        while(m --)
        {
            long long x;
            cin >> x;
            cout << -1 << endl;
        }
        return 0;
    }
    
    long long res = a[nn].first + a[nn + 1].first + a[nn + 2].first;
    
    
    
    for(long long i = 1;i <= n;i ++)
    {
        if(i == a[nn].second || i == a[nn + 1].second || i == a[nn + 2].second)
        {
            continue;
        }
        
        ans[i] = res;
    }
    
    while(m --)
    {
        long long x;
        cin >> x;
        
        if(x == a[nn].second || x == a[nn + 1].second || x == a[nn + 2].second && !ans[x])
        {
            if(x == a[nn].second)
            {
                long long aa = -1;
                for(long long i = nn + 1;i <= n - 2;i ++)
                {
                    if(check(i,i+1,i+2))
                    {
                        aa = a[i].first + a[i + 1].first + a[i + 2].first;
                        break;
                    }
                }
                
                ans[x] = aa;
                cout << ans[x] << endl;
                
            }
            else if(x == a[nn + 1].second)
            {
                long long aa = -1;
                
                if(nn + 3 <= n && check(nn,nn + 2,nn + 3))
                {
                    aa = a[nn].first + a[nn + 2].first + a[nn + 3].first;
                }
                if(aa == -1)
                {
                    for(long long i = nn + 2;i <= n - 2;i ++)
                    {
                        if(check(i,i+1,i+2))
                        {
                            aa = a[i].first + a[i + 1].first + a[i + 2].first;
                            break;
                        }
                    }
                }
                ans[x] = aa;
                cout << ans[x] << endl;
            }
            else
            {
                long long aa = -1;
                if(check(nn,nn + 1,nn + 3) && nn + 3 <= n)
                {
                    aa = a[nn].first + a[nn + 1].first + a[nn + 3].first;
                }
                
                if(check(nn + 1,nn + 3,nn + 4) && nn + 4 <= n && aa == -1)
                {
                    aa = a[nn + 1].first + a[nn + 3].first + a[nn + 4].first;
                }
                
                if(aa == -1)
                {
                    for(long long i = nn + 3;i <= n - 2;i ++)
                    {
                        if(check(i,i+1,i+2))
                        {
                            aa = a[i].first + a[i + 1].first + a[i + 2].first;
                            break;
                        }
                    }
                }
                ans[x] = aa;
                cout << ans[x] << endl;
            }
        }
        else
        {
            cout << ans[x] << endl;
        }
    }
    return 0;
}
posted @ 2020-05-03 12:16  QFNU-ACM  阅读(90)  评论(0编辑  收藏  举报