第320题能量项链
通过观察发现先将小的数乘积算出来这种情况下的能量是最大的(并没有证明过纯是瞎猫碰上死耗子)
正解还是区间DP
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
LL a[105];
LL b[105];
int main(){
int n;
LL sum = 0;
cin >> n;
for(int i = 0; i < n; i++){
cin >> a[i];
b[i] = a[i];
}
// 使用STL库的排序函数对B数组进行排序
sort(b, b + n);
// 有n个珠子,需要合成n-1次
for(int k = 0; k < n - 1; k++){
int index;
for(index = 0; index < n; index++)
if(a[index] == b[k])
break;
// 找到了当前最小的珠子的下标
// 查找前一个和后一个珠子的下标
int pre = index - 1, next = index + 1;
// 处理前驱已经被吞掉或前驱小于0的情况
while(a[pre] == -1 || pre < 0){
if(pre < 0)
pre = n - 1;
else
pre--;
}
// 处理后继已经被吞掉或后继大于最大下标的情况
while(a[next] == -1 || next >= n){
if(next >= n)
next = 0;
else
next++;
}
// 计算能量,并累加到sum中
sum += a[pre] * a[index] * a[next];
a[index] = -1; // 标记中间的珠子被消灭了
}
cout << sum << endl; // 输出总能量
return 0;
}