A - 拯救咕咕咕之史莱姆
思路:害,这题意理解岔了,在写代码之前一直在推第i天的伤害,也没想错,但是想多了,怪不得他们A的这么快!说一说咋想的吧。
首先,每一天的伤害都是由小洞和大洞一起提供的,不论大小都会减少史莱姆3点HP,所以我们需要把每一天有多少个大洞和小洞求出来也可以得到第i天的伤害了,最后弄一个前缀和就可以 O(1) 求出前 i 天的伤害。
看一下推导图,从第五天开始
当天的大洞的个数等于 前一天的大洞个数 + 三天前刚刚出现的小洞个数
当天的小洞个数等于 前一天的小洞个数 - 三天前的小洞个数 + 前一天大洞个数 * 2
就可以求出第 i 天一共有多少个洞了。剩下的模拟就可以了,虽然最后只需要前五天的数据
#include <bits/stdc++.h>
using namespace std;
long long big[100], small[100], hp;
void init() {
big[1] = 1; small[1] = 0;
big[2] = 1; small[2] = 2;
big[3] = 1; small[3] = 4;
big[4] = 1; small[4] = 6;
for(int i = 5;i <= 100; i++) {
big[i] = big[i-1]+(small[i-3]-small[i-4]);
small[i] = small[i-1] - (big[i]-big[i-1]) + big[i-1]*2;
}
}
int main() {
init();
long long sum = 0;
for(int i = 1;i <= 5; i++) {
sum += (big[i]+small[i]) * 3;
}
while(~scanf("%lld",