H_On个人小站

个人站

这都被你发现了【惊
奖励你一朵小红花~


鸡蛇的迷宫 - 模拟

题目链接

题目

虹之地六周目是一个幻想与科技的世界,里面有一种神奇的生物叫“鸡蛇”。然而鸡蛇并不是那么容易出现的,鸡会下蛋,有时候下的蛋是臭鸡蛋,只有臭鸡蛋才能孵出鸡蛇(因为鸡蛇虽然很强,但是并不会下蛋呦)。
鸡有初生态,次生态和完全体三个成长度,只有完全体的鸡才有凭空生鸡蛋的能力,而且生出来的鸡蛋(或臭鸡蛋)一定能孵出鸡(或鸡蛇),鸡每过一天就能进化一次,到完全体就不再进化。突然有一天,一只完全体的鸡意识到自己在这幻想世界存在的力量,决定用它来繁荣鸡种群的武装力量——通过繁育鸡蛇(鸡蛇会发射凋零射线,还会打怪物,很强的),现在我们知道了哪些时间鸡可能会生臭鸡蛋,并且知道了臭鸡蛋的产出率,想问问大家能不能通过科技力量计算出一段时间后鸡部落会出现多少鸡蛇。假设完全鸡觉醒的那一天是第一天。

输入

第一行输入两个整数,一个已知数据的组数 n 和繁殖的天数 e(0 <= n <= int(1e6), 1 <= e < 100)
接下来的 n 行每行有两个整数:di pi 表示第 di 天产出臭鸡蛋的概率是 pi (i = 1, 2, 3 . . ., n - 1, n)(1 <= di <= int(1e6), 0 <= pi <= 100)
注意数据的意思是第 di 天完全鸡生下的鸡蛋中 pi% 是臭鸡蛋,鸡蛋落地就会变成初生态的鸡并开始成长

输出

输出一个整数表示:到第 e 天鸡部总共落繁殖出的鸡蛇只数

样例输入

4 6
1 90
2 100
4 50
5 50

样例输出

2

解题思路

模拟的方式主要意思就是 用我们现实生活中解决这个问题的思路来解决这个问题 有事代码写多了计算机思维对于初入的新手可能会固化他的思维,有时很简单的方法却无论如何都想不到。
这个题的解题方式是将每一个阶段的鸡和鸡蛇的个数都记录起来,每一个状态的三个阶段的鸡的个数都是由上一个阶段的鸡的个数决定的,简单来说:

  • 完全态n+1 = 完全态n + 次生态n
  • 次生态n+1 = 初生态n
  • 初生态n+1 = 完全态n+1 - (完全态n+1 * 臭鸡蛋出现概率)

完全态x概率 之后的结果向下取整

  1. 其实这算是简化,数据设置在 long long 之内
  2. 天数的范围可以大于 100 不在所求天数范围内的数据无效,要么加判断要么开大数组

代码

注视很清晰哈

#include <iostream>

#define SMAX int(1e6 + 9)

typedef long long ll;

using namespace std;

int k[SMAX];

int main() {
        for (int i = 0; i < SMAX; i++) k[i] = 0;
        cin.tie(0);
        ios::sync_with_stdio(0);
        ll n, m; cin >> n >> m;
        for (int i = 0; i < n; i++) {
                int mo; cin >> mo;
                cin >> k[mo];
        }
        ll a = 0, b = 0, c = 1, r = 0;
        for (int i = 2; i < m; i++) {
                c += b;
                b = a;
                ll t = ll(double(c)*(double(k[i])/100.0));
                r += t;
                a = c - t;
        }
        cout << r << endl;
        return 0;
}