zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    大型网站核心架构因素
    大型网站架构模式
    博客中的文章归档是如何实现的
    Caused by: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
    git分支开发的好处
    layui之日期和时间组件
    vue-electron脚手架
    springboot1.5.4 配置druid1.1.0(使用druid-spring-boot-starter)
    Node.js读取文件内容并返回值(非异步)
    C# ftp ListFilesOnServer
  • 原文地址:https://www.cnblogs.com/QFNU-ACM/p/12821416.html
Copyright © 2011-2022 走看看