洛谷P6196
题目地址
问题大概说的就是找最小的代价值,
- 从端点开始删除比从中间代价更小
- 1最后删除或者可以说删除时统计1的数量即可
- 看洛谷一位巨佬的想法很特别但也很容易理解就是如果序列列中有1的话就以1为分界线分块算代价,因为1还是要留到最后的所以分块的这个想法很对(看到这里我就开始了操作)
- 借助别人的第一部思路我的想法:🐕
- 遇见1的话就开始计算之前块的代价计算
- 设置一个vector,处理不含1的u序列代价计算(我开始想的是两头删就用的deque,都能用就没改)
- 处理序列的时候可以在纸上试一下,2,3,4个的时候都是
∑
i
=
1
n
a
i
−
1
∗
a
i
+
m
i
n
(
a
)
\sum^{n}_{i=1}a_{i-1}*a_{i}\quad+\quad min{(a)}
∑i=1nai−1∗ai+min(a)
代码:
#include<bits/stdc++.h>
using namespace std;
deque<int>a;
int n,cacu_1;
long long ans;
void cacu(){
if(a.size()==1){
ans+=a[0];
a.clear();
}
else if(a.size()>1){
int minx=a[0];
for(int i = 1;i<a.size();i++){
minx=min(a[i],minx);
ans+=(a[i-1]*a[i]);
}
ans+=minx;
a.clear();
}
}
int main(){
a.clear();
cin>>n;
for(int i = 1;i<=n;i++){
int x;
scanf("%d",&x);
if(x == 1)
cacu(),cacu_1++;
else
a.push_back(x);
}
if(a.size()!=0){
cacu();
}
cout<<ans+cacu_1<<endl;
return 0;
}