HDU-6668-Game 百度之星第一场B

Posted bluefly-hrbust

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-6668-Game 百度之星第一场B相关的知识,希望对你有一定的参考价值。

  在多个连续的区间段中,选出连续重复度最高的区间,这样连续选出多个重复度最高的不相交区间,然后从第一个区间的左边已经右边开始,连续贪心即可,答案取最小值

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<vector>
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define LL long long
using namespace std;
vector<pii>v;
const int maxx = 1005;
int a[maxx];
int b[maxx];
int n;
LL go(int x)
   LL ans=0;
   for(int i=1;i<v.size();i++)
      if (v[i].first>x)
          ans+=(v[i].first-x+1)/2;
          if (i<v.size()-1)
             if ((v[i].first-x)%2) ///长度为奇数
                 if (v[i+1].first>v[i].second && v[i].second-v[i].first>0)
                    x=v[i].first+1;
                 else x=v[i].first;
             else x=v[i].first;
          else x=v[i].first;
      else 
          ans+=(x-v[i].second+1)/2;
          if (i<v.size()-1)
              if ((x-v[i].second)%2)
                 if(v[i+1].second<v[i].first && v[i].second-v[i].first>0)
                    x=v[i].second-1;
                 else x=v[i].second;
              else x=v[i].second;
          else x=v[i].second;
      
   
   return ans;

int main()
  int t;
  scanf("%d",&t);
  while(t--)
    v.clear();
    scanf("%d",&n);
    scanf("%d%d",&a[1],&b[1]);
    int l=a[1],r=b[1];
    for (int i=2;i<=n;i++)
        scanf("%d%d",&a[i],&b[i]);
        if (a[i]<=r && b[i]>=l)
            l=max(l,a[i]);
            r=min(r,b[i]);
        else 
            v.pb(mp(l,r));
            l=a[i];
            r=b[i];
        
    
    v.pb(mp(l,r));
    LL ans=2e18;
    ans=min(ans,go(v[0].first));
    ans=min(ans,go(v[0].second));
    printf("%lld\n",ans);
  
  return 0;

 

以上是关于HDU-6668-Game 百度之星第一场B的主要内容,如果未能解决你的问题,请参考以下文章

2017 百度之星 资格赛 题解

比赛百度之星2017 初赛Round A

2017"百度之星"程序设计大赛 - 资格赛 度度熊的王国战略

百度杯ctf--第一场--upload

百度之星2016初赛之部分题解

2016 百度之星 初赛B - 瞬间移动(逆元)