专栏文章

题解:CF2111C Equal Values

CF2111C题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip2x8xs
此快照首次捕获于
2025/12/03 05:17
3 个月前
此快照最后确认于
2025/12/03 05:17
3 个月前
查看原文

题意

给定一个包含 nn 个整数的数组,每次操作:
  1. 选位置 i(1<in)i(1<i≤ n),将左侧所有元素设为 aia_i,成本为 (i1)ai(i-1)・a_i
  2. 选位置 i(1i<n)i(1≤i<n),将右侧所有元素设为 aia_i,成本为 (ni)ai(n-i)・a_i
    求使数组所有元素相等的最小总成本。

思路

  • 目标值 xx 应为数组中的最小值,减少总成本。
  • 对于最小值 xx 的最左边出现位置,用操作 11 覆盖左边元素;最右边出现位置,使用操作 22 覆盖右边元素。
  • xx 出现多次,中间已覆盖,不需要操作。只用检查是未被覆盖的,并进行补充操作。

代码

CPP
#include<bits/stdc++.h>
using namespace std;
void solve(){
    int n;cin>>n;
    vector<int>a(n);
    for(int&x:a)cin>>x;
    int mn=*min_element(a.begin(),a.end());
    vector<int>pos;
    for(int i=0;i<n;++i)if(a[i]==mn)pos.push_back(i);
    long long res=(long long)pos[0]*mn+(long long)(n-1-pos.back())*mn;
    for(int i=1;i<pos.size();++i)res+=(long long)(pos[i]-pos[i-1]-1)*mn;
    cout<<res<<'\n';
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);
    int t;cin>>t;
    while(t--)solve();
return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...