Three displays

这里写图片描述
这里写图片描述
题解:
从整个数列中间挑一个数s[k],c[k],从左边挑一个s[i]小于它的并且是c[i]最小的,从右边挑一个
s[i]大于它的,c[i]最小的,每一轮进行一次比较:m3 = min(m3,(m1+c[i]+m2));

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
const int inf = 0x3f3f3f3f;
int n;
int s[3005],c[3005];
LL min(LL a,LL b)
{
    if(a>b) return b;
    return a;
}
int main()
{
    scanf("%d",&n);
    for(int i = 1 ; i <= n ; i++)
    scanf("%lld",&s[i]);
    for(int i = 1 ; i <= n ; i++)
    scanf("%lld",&c[i]);

    LL m1,m2,m3 = inf;//一定要注意初始化,在外面就要初始化的数字m3要注意 
    for(int i = 1 ; i < n ; i++)
    {   
        m1 = inf,m2 = inf;//每次循环不断更新的初始化也要注意 
        for(int j = 1 ; j < i ; j++)
        {
            if(s[j]<s[i])
            m1 = min(m1,c[j]);
        }
        for(int j = i+1 ; j <= n ; j++)
        {
            if(s[i]<s[j])
            m2 = min(m2,c[j]);
        }
        if(m1!=inf&&m2!=inf)
        m3 = min(m3,(m1+c[i]+m2));
    }
    if(m3!=inf)
    cout<<m3<<endl;
    else
    cout<<-1<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40240576/article/details/81571590
今日推荐