码迷,mamicode.com
首页 > 其他好文 > 详细

2019 年百度之星 初赛一 1002 Game

时间:2019-08-25 10:30:37      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:初始   field   游戏   rev   div   相同   计算   col   output   

传送门

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


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


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


Sample Input
1
2
1 10
20 30
 
Sample Output
5
 
 
样例描述
选取10为起点,经过的轨迹为10-12-14-16-18-20。
 


Source

 

 

题意:给n个区间,你需要依次经过每一个区间,初始位置任选,每次可以移动一步或者两步。问最少需要移动多少次。

题解:在输入的时候依次对有重合部分的区间进行合并,如果最后合并完之后只有一个区间那么初始位置你选这个区间内任意一点你就可以不用移动。当合并后区间数大于1时,下一个区间不是在上一个区间的左边就一定在它右边,我们可以根据第二个区间与第一个区间的位置关系决定初始位置为第一个区间的左端点还是右端点。又因为可以跳一步或者两步,那么你需要判断最后一步是跳一步更优还是两步更优。如果要跳的距离是偶数或者跳到的区间长度为1,显然只能有一种跳法。否则,你就可以往你跳的方向再移动一格,此时我们可以做个标记,如果下一次跳和这一次跳的方向相同那我们就将上一次跳到的点进行移动再计算移动次数。

代码:

技术图片
#include <bits/stdc++.h>
using namespace std;
const int N = 1000 + 10;
int a[N],b[N];
int main() {
    int T,n;
    for (scanf("%d",&T);T--;) {
        scanf("%d",&n);
        for (int i = 0; i < n; i++)
            scanf("%d%d",&a[i],&b[i]);
        int l = a[0],r = b[0],i;
        for (i = 1; i < n; i++) {
            int L = max(l,a[i]);
            int R = min(r,b[i]);
            if (L > R) break;
            l = L; r = R;
        }
        if (i == n) {
            printf("0\n");
            continue;
        }
        int fg = 0,ans = 0,x;
        if (b[i] < l) x = l;
        else x = r;
        for (; i < n-1; i++) {
            if (x > b[i]) {
                if (fg == -1) x--;
                ans += (x-b[i]+1)/2;
                if ((x-b[i])%2 == 1 && b[i] - a[i] > 0 ) fg = -1;
                else fg = 0;
                x = b[i];
            }else if (x < a[i]) {
                if (fg == 1) x++;
                ans +=(a[i] - x + 1) /2;
                if ((a[i]-x)%2 == 1 && b[i] - a[i] > 0 ) fg = 1;
                else fg = 0;
                x = a[i];
            }
        }
        if (x > b[i]) {
            if (fg == -1) x--;
            ans += (x-b[i]+1)/2;
        }else if (x < a[i]) {
            if (fg == 1) x++;
            ans +=(a[i] - x + 1) /2;
        }
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

2019 年百度之星 初赛一 1002 Game

标签:初始   field   游戏   rev   div   相同   计算   col   output   

原文地址:https://www.cnblogs.com/l999q/p/11407056.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!