题目链接:http://codeforces.com/problemset/problem/499/A
题目意思:有两种按钮:1、如果当前观看的时间是 t,player 可以自动处理下一分钟,姑且理解为跳到t+1; 2、直接跳过 x 分钟,如果player在第 t 分钟,则可以跳到 t+x 分钟。问恰好可以看完 n 部电影的最少观看时间。观看一部电影(假如为第 i 部,起始时间为 li, 结束时间为 ri)表示 li, li+1, li+2, ..., ri-1, ri 的时间都要覆盖到。
一开始做的时候想得太简单了,确实需要将每部电影的所有时间都覆盖到,但是要考虑到,如果不能恰好到达 li 这个时间点的话,意味着要在 li 之前的某个点就要开始覆盖,直到 ri。
我的做法是用一个cur_mom来记录看下一部电影前的到达时间。初始的时候是 1(题目说的)。问题是如何确定可以恰好到达 li。这里可以通过比较 li - cur_mom 是否能被 x 整除来判断。有余数的话代表不能恰好到达。处理完一部电影之后要更新cur_mom,它等于这部电影的结束时间 +1。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif // ONLINE_JUDGE int n, x;
while (scanf("%d%d", &n, &x) != EOF)
{
int l, r;
int ans = ;
int cur_mom = ; for (int i = ; i < n; i++)
{
scanf("%d%d", &l, &r);
if ((l-cur_mom) % x)
{
int tmp = l - cur_mom;
int num = tmp / x;
cur_mom += num * x;
}
else
cur_mom = l;
ans += r - cur_mom + ;
cur_mom = r+;
}
printf("%d\n", ans);
}
return ;
}