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
");
			else printf("NO
");
		}
		else
			cout << "YES" << endl;
	}
	return 0;
}
原文地址:https://www.cnblogs.com/gidear/p/14198349.html