2019 年百度之星 初赛一 1002 Game

传送门

Problem Description

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

Input

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

Output

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

Sample Input

1

2

1 10

20 30

Sample Output

5

样例描述

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

Source

2019 年百度之星·程序设计大赛 - 初赛一

题意:给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;
}

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

时间: 2024-08-28 15:24:10

2019 年百度之星 初赛一 1002 Game的相关文章

2019 年百度之星—初赛一 B题 Game

题目链接 题意:最开始可以选择任意位置,在一个坐标轴上,依次走到一个区间里面,可以选择走一步两步,求最小步数. 思路:贪心,刚开始合并区间,确定初始位置以及方向.往右走肯定到左端点,往左走先到右端点,判断下个区间的和下下个区间的方向是否一致,一致如果到是奇数,则当偶数处理位置,反之,仍然走到 端点上.wa了很多次,细节没注意好. #include<iostream> #include<algorithm> #include<string> #include<cst

数学 2015百度之星初赛2 HDOJ 5255 魔法因子

题目传送门 1 /* 2 数学:不会写,学习一下这种解题方式:) 3 思路:设符合条件的数的最高位是h,最低位是l,中间不变的部分为mid,由题意可得到下面的公式(这里对X乘上1e6用a表示,b表示1e6) 4 (h*power+l+mid)*a = (l*power+h+mid)*b 5 可推得:mid = ((h*power+l) * a - (l*power+h) * b) / (a - b); 6 所以可以枚举h,l然后求mid,注意mid的最低位一定是0,因为留出最低位加l或者h 7

2014百度之星初赛(第二场)——Best Financing

2014百度之星初赛(第二场)--Best Financing Problem Description 小A想通过合理投资银行理财产品达到收益最大化.已知小A在未来一段时间中的收入情况,描述为两个长度为n的整数数组dates和earnings,表示在第dates[i]天小A收入earnings[i]元(0<=i<n).银行推出的理财产品均为周期和收益确定的,可描述为长度为m的三个整数数组start.finish和interest_rates, 若购买理财产品i(0<=i<m),需要

HDU4828 Grids 2014百度之星初赛题解

看看Catalan数的公式:为 Catalan(n) = C(2n, n) / n+1 = C(2n, n) - C(2n, n-1); (公式0) 然后利用全排序表达:Catalan(n) = (2n)! / (n+1) * (n)!*n!; 那么Catalan(n-1) = (2(n-1))! / n * (n-1)!(n-1)!; 然后两者相除就得到:Catalan(n) = (4*n-2) / (n+1) (公式1)//这个就是递归的终极公式了. 一般使用动态规划的递推公式是:Catal

hdu 4832 百度之星初赛二B

把横的和竖的分开考虑 //#pragma comment(linker, "/STACK:102400000,102400000") #include<iostream> #include<vector> #include<algorithm> #include<cstdio> #include<queue> #include<stack> #include<string> #include<ma

2014 百度之星初赛题解1001 - Energy Conversion

Problem Description 魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的脑力. 过了许久,百小度终于读懂魔法文字的含义:石门里面有一个石盘,魔法师需要通过魔法将这个石盘旋转X度,以使上面的刻纹与天相对应,才能打开石门. 但是,旋转石盘需要N点能量值,而为了解读密文,百小度的能量值只剩M点了!破坏石门是不可能的,因为那将需要更多的能量.不过,幸运的是,作为魔法师的百小度可以耗费V点能量,使

2014百度之星初赛(第二场)——JZP Set

2014百度之星初赛(第二场)--JZP Set Problem Description 一个{1, ..., n}的子集S被称为JZP集,当且仅当对于任意S中的两个数x,y,若(x+y)/2为整数,那么(x+y)/2也属于S. 例如,n=3,S={1,3}不是JZP集,因为(1+3)/2=2不属于S.但是{1,2,3}的其他子集都属于S,所以n=3时有7个JZP集 给定n,求JZP集的个数. Input 第一行为T,表示输入数据组数. 每组数据包含一行整数n. 限制条件 1<=T<=10^5

LIS 2015百度之星初赛2 HDOJ 5256 序列变换

题目传送门 1 /* 2 LIS(非严格):首先我想到了LIS,然而总觉得有点不对:每个数先减去它的下标,防止下面的情况发生:(转载) 3 加入序列是1,2,2,2,3,这样求上升子序列是3,也就是要修改2个,但是中间的两个2,变化范围又不能超过(1,3) 4 那么这样求的也就不对,但是减掉之后,相当于给中间重复的数留下了修改的空间 5 解释下为什么可以减而保持正确性:因为题目所求时严格递增,假设是2,3, 4,那么变成1, 1, 1,所以在LIS里非严格递增就可以了 6 这也是为什么要在upp

二分搜索 2015百度之星初赛1 1003 序列变换

题目传送门 1 /* 2 二分搜索:在0-1e6的范围找到最小的max (ai - bi),也就是使得p + 1 <= a[i] + c or a[i] - c 3 比赛时以为是贪心,榨干智商也想不出来:( 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 #include <iostream> 10 using