杭电ACM学习笔记(2)-----1005&1006

版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/qq_41641805/article/details/82345418

//Author:ZJQ
//find repeated position
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a,b,n,i;
    int c[100];
    c[1]=1;
    c[2]=1;
    while(~scanf("%d %d %d",&a,&b,&n)&&(a!=0&&b!=0&&n!=0))
    {
        printf("1 %d\n",c[1]);
        printf("2 %d\n",c[2]);
        for(i=3;i<=n;i++)
        {
            c[i]=(a*c[i-1]+b*c[i-2])%7;
            printf("%d %d\n",i,c[i]);
        }
    }
}

该题显然具有递归的思路,可以考虑将不同输入对应不同的函数结果转换成数组形式,数组每个位置存放对应的结果,计算时即可省去递归,直接从数组中取出相关值进行运算即可。(用空间换时间!)

但是如果暴力运算,会出现Time Limited,所以应尽量找出规律,即找出从第几个开始结果出现重复以简化代码。

上面的代码可以用来找到重复位置,发现:c[n]==c[n%49]!!

下面贴出简化后的代码:

//Author:ZJQ
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a,b,n,i;
    int c[100];
    c[1]=1;
    c[2]=1;
    while(~scanf("%d %d %d",&a,&b,&n)&&(a!=0&&b!=0&&n!=0))
    {
        for(i=3;i<=49;i++)
        {
            c[i]=(a*c[i-1]+b*c[i-2])%7;
        }
        printf("%d\n",c[n%49]);
    }
}

//Author:ZJQ
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
    int d,i;
    double dm,df,ds;
    int t;
    while(~scanf("%d",&d)&&d!=-1)
    {
        t=0;
        for(i=1;i<=3600*12*11;i++)//提高精度*11
        {
            dm=(360.0*i)/(60.0*11);
            df=(360.0*i)/(3600.0*11);
            ds=(360.0*i)/(3600*12.0*11);
            int n1=(int)(dm/360.0);
            int n2=(int)(df/360.0);
            int n3=(int)(ds/360.0);
            double hh1=fabs((dm-n1*360.0)-(df-n2*360.0));
            double hh2=fabs((dm-n1*360.0)-(ds-n3*360.0));
            double hh3=fabs((df-n2*360.0)-(ds-n3*360.0));
            if(hh1>180)
                hh1=360.0-hh1;
            if(hh2>180)
                hh2=360.0-hh2;
            if(hh3>180)
                hh3=360.0-hh3;
            if(hh1>=d&&hh2>=d&&hh3>=d)
            {
                t+=1;
            }
        }
        printf("%.3lf\n",t*100/(3600*12.0*11));
    }
}

该题简直是100%纯天然的数学题,若用模拟,要不精度出问题,要不Time Limited,但个人认为本题实在无需过于纠结唯一的答案,故列出的代码依然是模拟,不过作了精度处理,使得答案一样,但还是超出时间。

猜你喜欢

转载自blog.csdn.net/qq_41641805/article/details/82345418