2019中山大学程序设计竞赛(重现赛)斐波那契/

 

2019中山大学程序设计竞赛(重现赛)

1002 三角形(斐波那契)

题意:给你n个木棒,判断其能否组成三角形。
这道题当时没做出来,后来看了题解,感觉acm的水还是很深的。

思路:判断能否组成三角形的情况比较多,故判断不能组成三角形的,那就是a[i]+a[i+1]=a[i+2],仔细一看这不是斐波那契数列吗?
因为这个数据量很大5*e6,而且众所周知,斐波那契数列上升速度(指数)还是十分快的。
F(100)=35422484179261915075>2的68次方,远远大于最长的棍子长度。
所以我们可以得出当n>100(50也行)时必能组成三角形。
1.n<100 先排序再进行比较,判断 ai+ai+1>ai+2;
2.n>=100,直接判断"YES";
在这里插入图片描述
代码待补完:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#include<bitset>
#include<utility>
#include<functional>
#include<iomanip>
#include<sstream>
#include<ctime>
#define ll long long
using namespace std;

int k[5000005];

int main()
{
    //ios::sync_with_stdio(false);
    int n;
    while (scanf("%d", &n) != EOF)
    {
        if (n < 50)
        {
            for (int i = 0; i < n; i++)
                scanf("%d", &k[i]);
            sort(k, k + n);
            int flag = 0;
            for (int i = 0; i < n - 2; i++)
            {
                if (k[i] + k[i + 1] > k[i + 2])
                {
                    flag = 1;
                    break;
                }
            }
            if (flag)
                printf("YES\n");
            else printf("NO\n");
        }
        else
            cout << "YES" << endl;
    }
    return 0;
}

 

posted @ 2019-04-20 11:34  gidear  阅读(141)  评论(0编辑  收藏  举报