zoukankan      html  css  js  c++  java
  • 三角形最大周长

    链接:https://ac.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


    对于这个题,就是你先按照数组从大到小拍个序,然后记录下标,
    首先你要先找到一个符合要求的最大的三角形周长
    for(z=n;z>=3;z--){
        if((s[z-1].b+s[z-2].b)>s[z].b){
            sum=s[z-1].b+s[z-2].b+s[z].b;
            n=z;
            break;
        }
    } 

    饭后分类讨论看看删除的这个是不是这三个木棒中的其中一个

    如果不是就直接输入sum,

    1.如果x=s[n].id

    if(x==s[n].id){
        int f=0;
        for(int i=n-1;i>=3;i--){
            if(s[i-1].b+s[i-2].b>s[i].b){
                cout<<s[i].b+s[i-2].b+s[i-1].b<<endl;
            f=1;
            break;
            }
        } 
        if(!f){
            cout<<-1<<endl;
        }
    }

    2.如果等于那两个的话:

             else if(x==s[n-1].id){
                    if(s[n-2].b+s[n-3].b>s[n].b){
                        cout<<s[n].b+s[n-2].b+s[n-3].b<<endl;
                    }
                    else{
                        int f=0;
                        for(int i=n-2;i>=3;i--){
                            if(s[i-1].b+s[i-2].b>s[i].b){
                                cout<<s[i].b+s[i-2].b+s[i-1].b<<endl;
                                f=1;
                                break;
                            }
                        }
                        if(!f){
                            cout<<-1<<endl;
                        }
                    }
                } 
                else{
                    if(s[n-1].b+s[n-3].b>s[n].b){
                        cout<<s[n].b+s[n-1].b+s[n-3].b<<endl;
                    }
                    else{
                        int f=0;
                        for(int i=n-3;i>=2;i--){
                            if(s[i].b+s[i-1].b>s[n-1].b){
                                cout<<s[i].b+s[i-1].b+s[n-1].b<<endl;
                                f=1;
                                break;
                            }
                        }
                        if(!f){
                            for(int i=n-3;i>=3;i--){
                                if(s[i-1].b+s[i-2].b>s[i].b){
                                    cout<<s[i].b+s[i-2].b+s[i-1].b<<endl;
                                    f=1;
                                    break;
                                }
                            }
                        }
                        if(!f){
                            cout<<-1<<endl; 
                        } 
                    }
    就是这样讨论,就是如果一个排好序的三个边(从小到大),a,b,c,(c>a+b)就能说明可以构成三角形
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=1e6+100;
    typedef long long ll;
    ll a[maxn];
    struct node{
        ll b;
        int id; 
    }s[maxn]; 
    bool cmp(node x,node y){
        return x.b<y.b;
    }
    int main(){
        int n,q;
        cin>>n>>q;
        for(int i=1;i<=n;i++){
            cin>>a[i]; 
            s[i].b=a[i];
            s[i].id=i;
        }
        sort(s+1,s+n+1,cmp);
        ll sum=-1;
        int z;
        for(z=n;z>=3;z--){
            if((s[z-1].b+s[z-2].b)>s[z].b){
                sum=s[z-1].b+s[z-2].b+s[z].b;
                n=z;
                break;
            }
        } 
        while(q--){
            int x;
            cin>>x;
            if(n==3||sum==-1){
                cout<<-1<<endl;
                continue;
            }
            int flag=0;
            for(int i=n;i>=n-2;i--){
                if(s[i].id==x){
                    flag=1;
                    break;
                }
            } 
            if(!flag){
                cout<<sum<<endl;
            }
            else{
                if(x==s[n].id){
                    int f=0;
                    for(int i=n-1;i>=3;i--){
                        if(s[i-1].b+s[i-2].b>s[i].b){
                            cout<<s[i].b+s[i-2].b+s[i-1].b<<endl;
                            f=1;
                            break;
                        }
                    } 
                    if(!f){
                        cout<<-1<<endl;
                    }
                }
                else if(x==s[n-1].id){
                    if(s[n-2].b+s[n-3].b>s[n].b){
                        cout<<s[n].b+s[n-2].b+s[n-3].b<<endl;
                    }
                    else{
                        int f=0;
                        for(int i=n-2;i>=3;i--){
                            if(s[i-1].b+s[i-2].b>s[i].b){
                                cout<<s[i].b+s[i-2].b+s[i-1].b<<endl;
                                f=1;
                                break;
                            }
                        }
                        if(!f){
                            cout<<-1<<endl;
                        }
                    }
                } 
                else{
                    if(s[n-1].b+s[n-3].b>s[n].b){
                        cout<<s[n].b+s[n-1].b+s[n-3].b<<endl;
                    }
                    else{
                        int f=0;
                        for(int i=n-3;i>=2;i--){
                            if(s[i].b+s[i-1].b>s[n-1].b){
                                cout<<s[i].b+s[i-1].b+s[n-1].b<<endl;
                                f=1;
                                break;
                            }
                        }
                        if(!f){
                            for(int i=n-3;i>=3;i--){
                                if(s[i-1].b+s[i-2].b>s[i].b){
                                    cout<<s[i].b+s[i-2].b+s[i-1].b<<endl;
                                    f=1;
                                    break;
                                }
                            }
                        }
                        if(!f){
                            cout<<-1<<endl; 
                        } 
                    }
                } 
            }
        }
    } 
    
    
    
     
  • 相关阅读:
    SQL生成上百万条数据 及分页 长沙
    aspx或ashx里面多个方法 进行ajax调用 长沙
    C# IO操作,文件 文件夹 长沙
    Reperter多层嵌套 长沙
    解读WPF中事件
    WPF 神话之Binding对象二
    WPF 神话之Binding对象一
    明白就好
    导出Execl和读取Execl文件
    新加入博客园,嘿嘿
  • 原文地址:https://www.cnblogs.com/lipu123/p/14389557.html
Copyright © 2011-2022 走看看