0%

CF-1075-B. The Curse of the Frog(遇到一个值,可以直接减掉的话最好,避免后续处理)

题目大意:B. The Curse of the Frog

一只青蛙位于数轴的 00 点,目标是到达坐标 xx。青蛙掌握 nn 种跳跃技能,每种技能 ii 包含三个参数:

  • aia_i:最大跳跃距离。单次跳跃可从 kk 移动到 [k,k+ai][k, k + a_i] 范围内的任意整数点。

  • bib_i:回滚周期。每当 bi,2bi,3bib_i, 2b_i, 3b_i \dots 次使用该技能时,会触发诅咒。

  • cic_i:回滚距离。触发诅咒时,青蛙会先从当前位置 kk 后退到 kcik - c_i,然后再进行跳跃,最终落点范围为 [kci,kci+ai][k - c_i, k - c_i + a_i]

目标: 计算到达 xx 点所需经历的最小回滚总次数。如果无法到达,则输出 1-1


样例解释

样例 1

  • 输入: x=1x=1, 技能:a=3,b=3,c=3a=3, b=3, c=3

  • 过程: 第一次使用技能,不触发回滚(因为 1<b=31 < b=3)。直接从 00 跳到 11

  • 结果: 00 次回滚。

样例 4

  • 输入: x=8x=8, 拥有 55 种技能。其中包含 (12,1,11)(12, 1, 11)(10,1,4)(10, 1, 4) 等。

  • 过程:

    1. 使用第 11 种技能(b=1b=1):触发回滚,从 00 退到 11-11,跳到 11
    2. 使用第 44 种技能(b=2b=2):这是该技能第 11 次使用,不回滚,从 11 跳到 22
    3. 使用第 22 种技能(b=1b=1):触发回滚,从 22 退到 2-2,跳到 88
  • 结果: 总计 22 次回滚。

样例 6

  • 输入: x=10x=10, 技能:a=2,b=2,c=1a=2, b=2, c=1

  • 过程:

    • 11 次跳:不回滚,020 \to 2
    • 22 次跳:回滚(第 b=2b=2 次),2132 \to 1 \to 3
    • 33 次跳:不回滚,353 \to 5
    • 44 次跳:回滚(第 2b=42b=4 次),5465 \to 4 \to 6
    • 以此类推,通过交替回滚逐步前进。
  • 结果: 总计 33 次回滚。

思路讲解

starsilk 的代码。不需要的值,我们其实可以减掉。会清爽一些。

然后最后的这个向上取整除法,可以这样子想,没消耗一个回滚,可以前行多少距离?wa×bcw\gets a\times b-c。这个可以这么看,你先回滚 c-c(因为前面的免费步已经用完了),然后可以走 bb 步,每步 aa 的长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false),cin.tie(0);
int T;
long long n,x,i,a,b,c,w;
for(cin>>T;T>0;T--)
{
cin>>n>>x;
w=0;
for(i=0;i<n;i++)
{
cin>>a>>b>>c;
x-=(b-1)*a;
w=max(w,a*b-c);
}
if(x<=0)cout<<"0\n";
else if(w==0)cout<<"-1\n";
else cout<<(x+w-1)/w<<'\n';
}
return 0;
}

AC代码

AC

https://codeforces.com/contest/2189/submission/359582687

心路历程(WA,TLE,MLE……)