【题解】HDU6669 Game⭐⭐⭐ 【区间贪心】

HDU6669 Game

度度熊在玩一个好玩的游戏。
游戏的主人公站在一根数轴上,他可以在数轴上任意移动,对于每次移动,他可以选择往左或往右走一格或两格。
现在他要依次完成 n 个任务,对于任务 i,只要他处于区间 [ai,bi] 上,就算完成了任务。
度度熊想知道,为了完成所有的任务,最少需要移动多少次?
度度熊可以任意选择初始位置。

Input

第一行一个整数 T (1≤T≤10) 表示数据组数。
对于每组数据,第一行一个整数 n (1≤n≤1000) 表示任务数。
接下来 n 行,第 i 行两个整数 ai,bi (1≤ai≤bi≤1000000) 表示任务对应的区间。

Output

对于每组数据,一行一个整数表示答案。

Examples

Sample Input
1
2
1 10
20 30

Sample Output
5

样例描述
选取10为起点,经过的轨迹为10-12-14-16-18-20。

Hint




题意:

题解:

注意题目要求为依次完成所有任务
首先我们考虑将所有交集合并, 然后在这些个交集上依次贪心的来取

首先判断下一段在当前段的左边还是右边(不可能再有相交), 尽量走两格, 遇见相隔长度为奇数的情况下再走一格

经验小结:

仔细考虑


#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef  long long LL;
const int inf = 1<<30;
const LL maxn = 1010;

struct node{
    int l, r;
}a[maxn], b[maxn];
int n;
int main()
{
    int T;
    cin >> T;
    while(T--){
        cin >> n;
        for(int i = 1; i <= n; ++i)
            cin >> a[i].l >> a[i].r;
        //取交集合并
        int cnt = 1;
        b[1] = a[1];
        for(int i = 2; i <= n; ++i){
            if(a[i].r < b[cnt].l || a[i].l > b[cnt].r)
                b[++cnt] = a[i]; //不相交
            else{
                b[cnt].l = max(b[cnt].l, a[i].l);
                b[cnt].r = min(b[cnt].r, a[i].r);
            }
        }

        int ans = 0, cur, len;
        if(b[2].r < b[1].l)
            cur = b[1].l;
        else
            cur = b[1].r;
        for(int i = 2; i <= cnt; ++i){
            if(b[i].r < b[i-1].l){
                len = cur-b[i].r, cur = b[i].r;
                if(len&1 && b[i].l < cur && i < cnt && b[i+1].r < b[i].l)
                    ++len, --cur;
            }
            else{
                len = b[i].l-cur, cur = b[i].l;
                if(len&1 && b[i].r > cur && i < cnt && b[i+1].l > b[i].r)
                    ++len, ++cur;
            }
            ans += len/2;
            if(len&1)
                ++ans;
        }
        cout << ans << endl;
    }

    return 0;
}

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页