ABC 263.D - Left Right Operation(思维)

https://atcoder.jp/contests/abc263/tasks/abc263_d

给我们一个长度为n的序列
只需执行一次以下连续操作:

选择一个整数x,将前x个数全部换成L
选择一个整数y,将后y个数全部换成R

问我们能得到的最小总和是多少?
Sample Input 1 
5 4 3
5 5 0 6 3
Sample Output 1 
14

Sample Input 2 
4 10 10
1 2 3 4
Sample Output 2 
10

Sample Input 3 
10 -5 -3
9 -6 10 -1 2 10 -1 7 -15 5
Sample Output 3 
-58
  • 这个题目我一开始不敢动笔写是因为分了三个段,
    然后不知道该在什么地方停止取,什么地方取下一段
  • 在看到各位大佬的代码时我仔细想了一下:为啥么不会出现一个取,一个不取的现象?
    因为每次都是跟L*i进行对比的嘞,所以就算想走歪路也不会偏的
    失策了,还是练得少了,加练
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=200200;
LL a[N];
LL f[N],g[N];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL n,L,R;
    cin>>n>>L>>R;
    for(LL i=1;i<=n;i++)
        cin>>a[i];
    f[0]=0;
    for(LL i=1;i<=n;i++)
        f[i]=min(f[i-1]+a[i],i*L);
    /*for(int i=0;i<=n;i++)
        cout<<f[i]<<" ";
    cout<<endl;*/
    g[n+1]=0;
    for(LL i=n;i>=1;i--)
        g[i]=min(g[i+1]+a[i],(n-i+1)*R);
    /*for(int i=0;i<=n;i++)
        cout<<g[i]<<" ";
    cout<<endl;*/
    LL minn=1e18;
    for(LL i=0;i<=n;i++)
    {
        minn=min(minn,f[i]+g[i+1]);
    }
    cout<<minn<<endl;
    return 0;
}
posted @ 2022-08-07 00:16  高尔赛凡尔娟  阅读(97)  评论(0编辑  收藏  举报