P10132 [USACO24JAN] Cannonball 题解

· · 题解

思路

简单按照题意模拟,向左还是右走就记录偏移量为 1 或 -1,移动时让当前坐标加上移动距离乘偏移量。

为了防止出现题目中的死循环,记录一下循环跑了几次,超过一定阈值就算它死循环。

Code

int main()
{
    int ans = 0, op = 1, power = 1, cnt = 0;
    while (1 <= s && s <= n)
    {
        if (++cnt == 10000000)
            break;
        if (q[s] == 0)
        {
            if (op == 1)
                op = -1;
            else
                op = 1;
            power += v[s];
        }
        else if (!st[s] && power >= v[s])
        {
            st[s] = true;
            ans ++;
        }
        s += power * op;
    }
    printf("%d", ans);
}