每日一題 — 2020 - 05 - 04

昨天忙着整別的事情,看了每日一題,但是沒寫博客整理,所以今天整理一下,題目挺不錯的,不怎麼會,不過是思維暴力(帶點技巧)

題目鏈接

推理過程:

  • 三角形題目,問題要求刪去一個值,剩下的能組成的周長最大的三角形。
  • 這裏三角形的問題用貪心的思想我也是第一次遇到,從大到小排序,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");
        }    
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章