题意
给出d和p,以及若干个数s0,s1,s2......如果没有给足d+1个数,说明这个序列满足s[n]是s[n-1]和s[n-2]的线性组合,即s[n]=a*s[n-2]+b*s[n-1],否则这个序列会全部给出。
根据题意:这个序列是一个非减序列
如果p<s[0],输出"The spider is going to fall!"
如果p>=s[d],输出"The spider may fall!"
否则输出第一个大于p的数的位置
题意题
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define MAXN 10010
#define MAXM 60010
#define MOD 1000000007
#define INF 1000000007
#define FI first
#define SE second
#define EPS 1e-8
int n,d,p;
double a[MAXN];
char s[MAXM];
int dcmp(double x)
{
if(fabs(x)<EPS) return 0;
return x<0?-1:1;
}
int main()
{
//freopen("/home/moor/Code/input","r",stdin);
while (scanf("%d%d",&d,&p)!=-1)
{
gets(s);
n=0;
int l=strlen(s);
for (int i=0;i<l;)
{
int tmp=0;
while (i<l&&(s[i]<'0'||s[i]>'9')) i++;
if (i>=l) break;
while (i<l&&s[i]>='0'&&s[i]<='9') tmp=tmp*10+s[i++]-'0';
a[n++]=tmp;
}
if (p<a[0])
{
printf("The spider is going to fall!\n");
continue;
}
int flag=0;
for (int i=0;i<n;i++)
if (a[i]>p)
{
printf("%d\n",d-i+1);
flag=1;
break;
}
if (flag) continue;
if (d+1==n)
{
printf("The spider may fall!\n");
continue;
}
int tmp=a[0]*a[2]-a[1]*a[1];
double x,y;
if (tmp==0)
{
x=0;
if (a[1]==0) y=0;
else y=1.0*a[2]/a[1];
}
else
{
x=1.0*(a[2]*a[2]-a[3]*a[1])/tmp;
y=1.0*(a[0]*a[3]-a[1]*a[2])/tmp;
}
for (int i=n;i<d+1;i++)
{
a[i]=x*a[i-2]+y*a[i-1];
if (dcmp(a[i]-p)>0)
{
printf("%d\n",d-i+1);
flag=1;
break;
}
}
if (!flag) printf("The spider may fall!\n");
}
return 0;
}