2020年浙江理工大学新生赛 C Cly的三角形

Description
Cly很喜欢三角形,有一天他遇到了一道和三角形有关的题,但是这道题他简单了,他懒得做,于是交给了你。
给定一个数组,每次询问一个子区间,如果能从这个子区间挑出三个数组成三角形输出clynb,否者输出clycdd

Input
第一行给出数组大小n,查询次数q (1<=n,q<=1e5)
接下来一行输入n个数,表示a[i] (1<=a[i]<=1e9)
接下来q行,每行输入两个数l,r,代表一个子区间 (1<=l,r<=n)

Output
对于每个询问输出clynb或者clycdd

Sample Input

5 3
2 1 4 3 5
1 2
1 3
3 5

Sample Output

clycdd
clycdd
clynb

题目分析:
首先尝试构造不能组成三角形的序列
由于数据有规模限制,我们要使序列中的数尽可能小,又恰好不能组成三角形
不难发现,序列是

1,1,2,3,5,8,13......

斐波那契数列
由于a[i]<=1e9,我们计算恰好小于等于1e9的斐波那契数是第44

	long long a[100];
	a[1]=1;a[2]=1;
	for(int i=3;i<99;i++){
		a[i]=a[i-1]+a[i-2];
		if(a[i]>1e9){
			cout<<i-1;//输出的是44 
			break;
		}
	}

因而

长度超过 44 的区间必然可以组成三角形

所以只需要对长度超过 44 的区间暴力判断是否能组成三角形

由于

排序后的序列,相邻的 3 项最可能组成三角形

所以
只需要对选中的区间排序,然后对相邻3项判断即可

下面给出代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

int main(){
	int n,q;
	cin>>n>>q;
	long long a[100010],b[100];
	for(int i=0;i<n;i++)
		cin>>a[i];
	int l,r;
	
	for(int i=0;i<q;i++){
		scanf("%d%d",&l,&r);
		l--;
		r--;
		if(r-l>50) printf("clynb\n");//这里稍微写大一点也可以
		else if(r-l==1 or l==r) printf("clycdd\n");
		else{
			int cnt=0;
			for(int j=l;j<=r;j++)
				b[cnt++]=a[j];
			sort(b,b+cnt);
			bool flag=false;
			for(int j=0;j<cnt-2;j++){
				if(b[j]+b[j+1]>b[j+2]){
					flag=!flag;
					break;
				}
			}
			if(flag) printf("clynb\n");
			else printf("clycdd\n");
		} 
	}
	return 0;
} 
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值