ACM复习(39)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

输出样例
5
29


解题思路

其实仔细想一想蚂蚁的繁殖条件就能发现如果蚂蚁可以繁殖那么在任何一个时间点蚂蚁的数量都肯定是:
count >= 2 && (count % 3 == 0 || (count - 1) % 3 == 0)

然后我们只需要往前推算,如果推算过程的任意一个时期都满足上述条件那么该世界的蚂蚁可繁殖且推算结果就是该世界在死神时期的蚂蚁数量,否则该世界蚂蚁不可繁殖

#include<stdio.h>
int main()
{
    int t, start, end, n, inter, count, total, j, k, nums[1002];
    scanf("%d", &t);
    while(t --)
    {   
        total = 0;
        scanf("%d %d %d %d", &n, &inter, &start, &end);
        for(int i = 0; i < n; i ++)
            scanf("%d", &nums[i]);
        count = (end - start) / inter;
        for(int i = 0; i < n; i ++)
        {   
            k = nums[i];
            for(j = 0; j < count; j ++)
            {
                if(k <= 2 || k % 3 == 2)
                    break;
                k -= k / 3;
            }
            if(j == count)
                total += k;
            else
                total += nums[i];
        }
        printf("%d\n", total);
    }
    return 0;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值