codeforces 499A.Inna and Pink Pony 解题报告

题目链接: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。

  

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     #ifndef ONLINE_JUDGE
10         freopen("in.txt", "r", stdin);
11     #endif // ONLINE_JUDGE
12 
13     int n, x;
14     while (scanf("%d%d", &n, &x) != EOF)
15     {
16         int l, r;
17         int ans = 0;
18         int cur_mom = 1;
19 
20         for (int i = 0; i < n; i++)
21         {
22             scanf("%d%d", &l, &r);
23             if ((l-cur_mom) % x)
24             {
25                 int tmp = l - cur_mom;
26                 int num = tmp / x;
27                 cur_mom += num * x;
28             }
29             else
30                 cur_mom = l;
31             ans += r - cur_mom + 1;
32             cur_mom = r+1;
33         }
34         printf("%d
", ans);
35     }
36     return 0;
37 }

  

原文地址:https://www.cnblogs.com/windysai/p/4187864.html