zoukankan      html  css  js  c++  java
  • 2019 年百度之星·程序设计大赛

    传送门

    [1]hdu

    [2]bestcoder

    B.Game(贪心+思维)

    •题意

    一步可以走一个或者两个,求依次进入n个区间[li,ri]的最少步数

    •思路

    就当前位置cur来说,

    1)如果下一个任务的区间包括当前位置,那就可以不动

    2)如果下一个任务区间在当前位置左边,那就向下一个的左边界移动

        ①如果正好可以全走两个格子的话,就在此位置

        如果不可以全走两个格子的话,

     ②如果再下一个位置在左边的话,那就不动

     ③如果再下一个位置在右边的话,那就把走的一格变成两格,在左边界往右一个位置

    3)如果下一个任务区间在当前位置右边,那就向下一个的右边界移动

        ①如果正好可以全走两个格子的话,就在此位置

        如果不可以全走两个格子的话,

     ②如果再下一个位置在右边的话,那就不动

     ③如果再下一个位置在左边的话,那就把走的一格变成两格,在右边界往左一个位置

    起点在最小区间的左边界或者右边界

    •代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int maxn=1000+50;
     5 
     6 int n;
     7 int l[maxn];
     8 int r[maxn];
     9 
    10 ll F(int k,int p)
    11 {
    12     ll ans=0;
    13     while(k <= n)
    14     {
    15         if(p >= l[k] && p <= r[k])
    16         {
    17             k++;
    18             continue;
    19         }
    20         if(l[k] > p)
    21         {
    22             ll cur=l[k]-p;
    23             ans += (cur+1)/2;
    24             p=l[k];
    25 
    26             if(cur%2 == 0)
    27                 continue;
    28 
    29             int tmp=k;
    30             for(;tmp <= n && l[tmp] <= p && r[tmp] > p;tmp++);
    31 
    32             if(tmp > n)
    33                 return ans;
    34 
    35             if(l[k] != r[k] && l[tmp] > p)
    36                 p++;
    37         }
    38         else
    39         {
    40             ll cur=p-r[k];
    41             ans += (cur+1)/2;
    42             p=r[k];
    43 
    44             if(cur%2 == 0)
    45                 continue;
    46 
    47             int tmp=k;
    48             for(;tmp <= n && l[tmp] < p && r[tmp] >= p;tmp++);
    49 
    50             if(tmp > n)
    51                 return ans;
    52 
    53             if(l[k] != r[k] && r[tmp] < p)
    54                 p--;
    55         }
    56     }
    57     return ans;
    58 }
    59 int main()
    60 {
    61     int T;
    62     scanf("%d",&T);
    63     while(T--)
    64     {
    65         scanf("%d",&n);
    66         for(int i=1;i <= n;++i)
    67             scanf("%d%d",l+i,r+i);
    68 
    69         int L=l[1];
    70         int R=r[1];
    71         for(int i=2;i <= n;++i)
    72         {
    73             int x=max(max(l[i],l[i-1]),L);
    74             int y=min(min(r[i],r[i-1]),R);
    75 
    76             if(x > y)
    77                 break;
    78             L=x;
    79             R=y;
    80         }
    81         ll ans=min(F(1,L),F(1,R));
    82 
    83         printf("%I64d
    ",ans);
    84     }
    85     return 0;
    86 }
    View Code

     

  • 相关阅读:
    angular学习一框架结构认识
    关于react上线系列问题及解决方案
    typescript学习笔记
    keepalived + glusterfs实现高可用
    nginx限制单个IP的最大连接数量限制下载速度
    初识Python.day2
    初识Python
    服务器安装到优化
    windows云服务器数据迁移
    z字形变换
  • 原文地址:https://www.cnblogs.com/MMMinoz/p/11380974.html
Copyright © 2011-2022 走看看