链接:https://ac.nowcoder.com/acm/contest/134/A
来源:牛客网
铁子从森林里收集了n根木棍,她开始将它们按顺序的排成一排,从左到右依次为1到n,她回想起
在数学课上老师教她的三角形知识,她开始从这些木棍中间找三根木棍来组成一个周长最大的三角形,
这时她的兄弟顺溜偷偷的溜了过来,偷走了第i根木棍,现在她想知道现在能够组成周长最大的三角形
的周长是多少?
在数学课上老师教她的三角形知识,她开始从这些木棍中间找三根木棍来组成一个周长最大的三角形,
这时她的兄弟顺溜偷偷的溜了过来,偷走了第i根木棍,现在她想知道现在能够组成周长最大的三角形
的周长是多少?
输入描述:
第一行两个整数n和q。(1 ≤ n, q ≤ 105)
第二行n个整数表示第i根木棍的长度ai。(1 ≤ ai ≤ 109)
接下来q行,每行一个整数表示被顺溜偷走的木棍编号。注意每行的事件是独立的,也就是说每一次操作都是对于原来的n根木棍进行的。
第二行n个整数表示第i根木棍的长度ai。(1 ≤ ai ≤ 109)
接下来q行,每行一个整数表示被顺溜偷走的木棍编号。注意每行的事件是独立的,也就是说每一次操作都是对于原来的n根木棍进行的。
输出描述:
对于每个询问输出一行表示答案,如果删除木棍后无法组成三角形则输出 -1 。
示例1
输出
复制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; } } } } } }