UVAlive 6157 How do spiders walk on water?

题目

题意

给出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;
}


你可能感兴趣的:(UVAlive 6157 How do spiders walk on water?)