昨天忙着整別的事情,看了每日一題,但是沒寫博客整理,所以今天整理一下,題目挺不錯的,不怎麼會,不過是思維暴力(帶點技巧)
推理過程:
- 三角形題目,問題要求刪去一個值,剩下的能組成的周長最大的三角形。
- 這裏三角形的問題用貪心的思想我也是第一次遇到,從大到小排序,3個連在一起,第一個符合的就是最大的,也可以證明(自己寫下就明白了)
- 所以我們按照這個規律來解這個題,我們之間暴力循環搜索,表面看上去複雜度是O(q*n),但是實際並沒有,因爲不可能存在1e5中不超過1e9的數(要符合斐波那契數列,第1e5位可想而知),因此暴力是可以的。
- 所以我們分幾種情況就OK,第一個是第一個位置是否被刪除,第二個位置是否被刪除,第三個位置是否被刪除,然後我們判斷是否能構成三角形即可。
- 這裏可能就超出了n的範圍,不過不用擔心,後面的都是默認值0,所以並不會影響的
代碼:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100010;
struct solve
{
long long l;
int id;
}a[N];
bool cmp(solve x, solve y){
return x.l > y.l;
}
int main(){
int n, q;
scanf("%d%d",&n,&q);
for (int i = 1; i <= n; i++){
scanf("%lld",&a[i].l);
a[i].id = i;
}
sort(a + 1, a + n + 1,cmp);
int x, y, z;
for (int i = 0; i < q; i ++){
int t;
scanf("%d",&t);
long long res = 0;
for (int i = 1; i <= n - 2; i ++){
if (a[i].id == t) continue;
else if (a[i + 1].id == t){
x = i;
y = i + 2;
z = i + 3;
}
else if(a[i + 2].id == t){
x = i;
y = i + 1;
z = i + 3;
}
else {
x = i;
y = i + 1;
z = i + 2;
}
if (a[y].l + a[z].l > a[x].l){
res = a[y].l + a[z].l + a[x].l;
printf("%lld\n",res);
break;
}
}
if (res == 0){
puts("-1");
}
}
}