和题解中那个使用multiset的代码完全相同,但是改成了set
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <set>
#include <algorithm>
#define MAX (1000005)
using namespace std;
int min(int a, int b) {
return (a >= b) ? b : a;
}
set<int> s;
set<int>::iterator iter;
int main() {
fstream infile, outfile;
infile.open("turnover.in");
outfile.open("turnover.out");
int n;
infile >> n;
int a;
int tiger = 0;
infile >> a;
int number;
s.insert(MAX); s.insert(-1 * MAX); // 插入最大值与最小值
s.insert(a); tiger = a;
while (--n) {
infile >> a;
if (s.count(a)) {
number = 0;
}
else {
iter = s.insert(a).first; //set的insert返回一个pair,first为插入位置的迭代器,second为是否插入成功的布尔值
iter++;
set<int>::iterator right = iter;
iter--; iter--;
set<int>::iterator left = iter;
if (*right == MAX) {
number = (a - *left);
}
else if (*left == (-1 * MAX)) {
number = (*right - a);
}
else {
number = min(a - *left, *right - a);
}
}
tiger += number;
}
outfile << tiger << endl;
infile.close();
outfile.close();
return 0;
}