zoukankan      html  css  js  c++  java
  • 1G.小a的排列(C++)

    小a的排列(C++)

    点击做题网站链接

    题目描述
    小a有一个长度为n的排列。定义一段区间是"萌"的,当且仅当把区间中各个数排序后相邻元素的差为1现在他想知道包含数x,y的长度最小的"萌"区间的左右端点
    也就是说,我们需要找到长度最小的区间[l,r],满足区间[l,r]是"萌"的,且同时包含数x和数y
    如果有多个合法的区间,输出左端点最靠左的方案。

    输入描述:
    第一行三个整数N,x,y,分别表示序列长度,询问的两个数
    第二行有n个整数表示序列内的元素,保证输入为一个排列

    输出描述:
    输出两个整数,表示长度最小"萌"区间的左右端点

    示例1
    输入

    5 2 3
    5 2 1 3 4

    输出
    2 4

    说明
    区间[2,4]={2,1,3}包含了2,3且为“萌”区间,可以证明没有比这更优的方案

    示例2
    输入

    8 3 5
    6 7 1 8 5 2 4 3

    输出
    5 8

    备注:
    保证2n105,1x,yn2⩽n⩽10^5,1⩽x,y⩽n

    解题思路:

    "萌"的条件就是l - r == max - min(区间长度等于区间内的最大值减最小值)
    那么我们先在l到r的区间中求出最大值和最小值,然后再去找这个区间外面的但是值是最小值到最大值范围中的数
    所以我们只需要去模拟这个过程就好了,不断的找l到r区间外面的数,不断的更新最大值和最小值。

    解题代码:

    #include <iostream>
    #include <algorithm>
    using namespace std;
    int pre[100005];
    
    int main()
    {
        ios::sync_with_stdio(0);
        int n,x,y;//序列长度,询问的两个数
        cin >> n >> x >> y;
        int l,r;//区间的左右端点
        for(int i=1;i<=n;++i)
        {
            cin >> pre[i];
            if( pre[i]==x ) l = i;//如果输入的数字和x一样,用l记录其位置
            if( pre[i]==y ) r = i;//如果输入的数字和y一样,用r记录其位置
        }
        if( l>r ) swap(l,r);
        
        int xx = 0, yy = n+1;
        while( r-l!=xx-yy )//"萌"的条件就是r-l==max-min(区间长度等于区间内的最大值减最小值)
        {
            for(int i=l;i<=r;++i)//l到r的区间中求出最大值和最小值
            {
                xx = max(xx, pre[i]);//最大值
                yy = min(yy, pre[i]);//最小值
            }
            for(int i=1;i<=n;++i)//再去找这个区间外面的但是值是最小值到最大值范围中的数
            {
                if( pre[i]>yy && pre[i]<xx && i<l ) l = i;
                if( pre[i]>yy && pre[i]<xx && i>r ) r = i;
            }
        }
        cout << l << " " << r << endl;
    }
    
  • 相关阅读:
    poj 3616 Milking Time
    poj 3176 Cow Bowling
    poj 2229 Sumsets
    poj 2385 Apple Catching
    poj 3280 Cheapest Palindrome
    hdu 1530 Maximum Clique
    hdu 1102 Constructing Roads
    codeforces 592B The Monster and the Squirrel
    CDOJ 1221 Ancient Go
    hdu 1151 Air Raid(二分图最小路径覆盖)
  • 原文地址:https://www.cnblogs.com/yuzilan/p/10626084.html
Copyright © 2011-2022 走看看