题解:CF2148C Pacer
wangzhaohan2910 · · 题解
首先我们一看到
通过信息学竞赛中常用得不完全归纳法,我们可以得出,设有
- 如果
k 是奇数,并跑到异侧,则每分钟都用来跑步,得分为k 。 - 如果
k 是偶数,并跑到异侧,因为k 不可能为 0(保证对于所有i > 1 ,均有a_i > a_{i-1} ,所以a_i-a_{i-1} > 0 ),所以必须摸一分钟鱼,然后剩下时间都用来跑步,得分为k-1 。 - 如果
k 是奇数,并跑到同侧,则也摸一分钟鱼,然后剩下的时间用来跑步,得分为k-1 。 - 如果
k 是偶数,并跑到同侧,就全力以赴,不停地折返跑,得分为k 。
接下来再解决一个问题:最后一个要求完成了,那剩下的时间(也就是
肯定不是呀,那肯定要不停的跑以获得最高的分数呀。所以最终得分还要加一个
同时,作为信息学竞赛,我们还要讲究两个复杂度:时间复杂度和空间复杂度。时间复杂度显然最快也就只能是
以下见代码:
:::success[solution]
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
using namespace __gnu_debug;
signed main()
{
int t;
cin >> t;
while (t--)
{
int n, m, preva{}, prevb{}, ans{};
cin >> n >> m;
while (n--)
{
int a, b;
cin >> a >> b;
if (b == prevb) // 同侧,所以要跑偶数次
if (a - preva & 1) // 奇数分钟,所以要减去 1,否则会跑到异侧
ans += a - preva - 1;
else // 偶数分钟,所以每分钟都要跑
ans += a - preva;
else // 异侧,所以要跑奇数次
if (a - preva & 1) // 如果时间本身就是奇数,就每分钟都要跑
ans += a - preva;
else // 偶数分钟,所以要减去 1,否则会回到同侧
ans += a - preva - 1;
preva = a;
prevb = b;
}
// 剩下的时间都用来来回跑
cout << m - preva + ans << endl;
}
return 0;
}
:::
不理解的同学可以自己跑一跑步试试。