zoukankan      html  css  js  c++  java
  • 10686 DeathGod不知道的事情

    Description

        蚂蚁是很强大的动物,除了DeathGod知道的事情外还有很多不知道的!例如… 
        根据某种理论,时间方向上有无数个平行世界,有的世界蚂蚁很多,有的世界蚂蚁很少,有的世界蚂蚁会繁殖,有的世界蚂蚁不会繁殖。 DeathGod没有时空穿梭的能力,因此他无法知道所有的蚂蚁加起来到底有多少。但他知道未来的ACMer非常厉害,可以暂时抛弃肉体,以思维进行时空旅行。
    因此他留下一段话给未来的ACMer,让他们帮他数一数,所有的平行世界总共有几只蚂蚁。
        由于时间旅行是不可逆的,因此DeathGod只能让ACMer逆向推算出在DeathGod的那个时间点上所有的平行世界总共有多少只蚂蚁。
        此时,未来的ACMer,就是你,已经在无数个平行世界中搜索过了(只用了一瞬间),在你所处的时间点上,第0,1,2,3…N-1个
    平行世界上的蚂蚁数目分别为A[0],A[1],A[2],A[3]….A[N-1],为了简化计算,所以每个平行世界上的蚂蚁数目都是当作整数计算。
    而已知每两只蚂蚁每过时间t,就会生出一只蚂蚁。如果有八只蚂蚁,那么过了时间t后就会变成十二只蚂蚁,再过时间t就会变成十八只蚂蚁。
    如果蚂蚁数目是单数,比如有七只蚂蚁,那么过了时间t后就会变成十只蚂蚁。再过时间t就会变成十五只蚂蚁。有的世界里面的蚂蚁是不会繁衍的,
    因此蚂蚁的个数就不会变化,不会遵从这个定律。假设所有的蚂蚁不会死亡。那么你应该可以计算出在DeathGod所在的时间点上,
    最少可能存在几只蚂蚁(如果只有一只蚂蚁,是不会繁衍的,如果蚂蚁会繁衍,那么一定遵从上面的定律。如果不遵从上面定律的,
    那么一定不会繁衍。且蚂蚁只能跟和自己同一个世界里的蚂蚁交配。)
        不过,最囧的事情就是,即使你算出来了,由于信息无法逆时间方向传递,因此DeathGod还是无法知道。不过为了培养未来的ACMer的耐心和毅力,
    以及面对恶心模拟题时不至于双眼发昏脑袋发胀,因此还是要把答案算出来。
    




    输入格式

    第一行输入case数T(T<100),第二行开始每个case输入一个N表示平行世界的数目,输入一个t表示蚂蚁繁衍间隔时间,
    输入t1,t2表示DeathGod所在时间和未来的ACMer所在时间。接下来换行输入A[0],A[1]…A[N-1],用空格间开。
    (0<A[0]…A[N-1],t,t1,t2<=10000,0<N<1000,t<t1<t2)。



    输出格式

    对于每个case输出一个蚂蚁的总数,每个一行。



     

    输入样例

    2
    1 1 0 2
    10
    2 1 0 4
    28 23
    



     思路:

    /*每逆推一个数,就倒回来,
    判断反逆推后与逆推结果的差值是否大于等于1*/

    输出样例

    5
    29
    #include<stdio.h>
    #include<math.h>
    int main()
    {
        int T,n,t,t1,t2,a[1010];
        int i,j1,j2,k,sum;
        double temp1,temp2;
        scanf("%d",&T);
        for(i=1; i<=T; i++)
        {
            sum=0;
            scanf("%d%d%d%d",&n,&t,&t1,&t2);
            for(j1=0; j1<n; j1++)
                scanf("%d",&a[j1]);
    
            k=(t2-t1)/t;
            for(j1=0; j1<n; j1++)
            {
                temp1=temp2=a[j1];
                for(j2=1; j2<=k; j2++)
                {
                    temp2=(temp2*2)/3.0;
                    if(temp2>floor(temp2)) temp2=floor(temp2)+1;
                    if(((temp2*3)/2)-temp1>=1)/*每逆推一个数,就倒回来,
                    判断反逆推后与逆推结果的差值是否大于等于1*/
                    {
                        sum+=a[j1];
                        temp2=0;
                        break;
                    }
                    else temp1=temp2;
                }
                sum+=temp2;
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    二叉树(链表形式)
    判断一个非空单链表是否是递增有序的
    指针的异或运算可用于交换两个变量的值
    JavaScript导论
    JavaScript语言的历史
    分享一个分页控件的实现思路
    MVC还是MVVM?或许VMVC更适合WinForm客户端
    基于NPOI的Excel数据导入
    一段用于地址清洗的代码
    模块3之手机号码格式的校验
  • 原文地址:https://www.cnblogs.com/orchidzjl/p/4263454.html
Copyright © 2011-2022 走看看