如图所示,这道题的暴力解法就是枚举每天的营业额,让该营业额和前面的天的营业额依次相减取最小值这样的话我们的时间复杂度就是N平方,我们是很有可能超时的
所以我们选择用set容器的二分查找功能
我们每次遍历到一个数的时候,前面的天的营业额要保证都插入进了set容器里
然后我们用lowerbound找到set里面大于等于这天营业额最小的数,和小于这天营业额最大的数,比较一下哪个差距小,就算哪个
lowerbound的迭代器减减就是我们小于这天营业额最小的值,但是如果set里只有一个数的话,我们迭代器减减是会越界的呀,我们可以给这个set容器定义两个极大值和极小值,也就是正无穷和负无穷,是不会影响最小波动值的结果的
实现一下代码
#include <iostream>
#include <set>
#include <cmath>
#include <cstdlib>
using namespace std;typedef long long ll;
ll n;
const int INF = 0x3f3f3f3f;
const int N = 3e4;
ll a[N];
int main()
{set<int> st;ll ret = 0;cin >> n;int x;cin >> x;ret+=x;st.insert(x);st.insert(-INF);st.insert(INF);for(int i = 2;i<=n;i++){ll x;cin >> x;auto it = st.upper_bound(x);auto tmp = it;tmp--;ret+=(min(abs(*it-x),abs(*tmp-x)));st.insert(x);}cout << ret << endl;return 0;
}