题目描述
一指数列A={a1, a2, …, an},根据数列A计算数列B={b1, b2, …, bn},其中:
输入格式
第一行是一个正整数t,表示测试数据的组数。接下来有t行,每行表示一组测试数据。每行以一个正整数n开始,表示数列A中元素的个数;然后是n个非负整数,依次表示a1, a2, …, an的值。
0<t<=10
0<n<=100 000
0<= ai<=65 536
输出格式
对于每组测试数据,输出数列B的所有的元素之和。
输入输出样例
输入 #1 复制
2
5 1 2 3 4 5
7 2 9 7 4 6 2 6
输出 #1 复制
5
14
提意:找最接近的元素(二分 或者 用set)。
#include<bits/stdc++.h>
using namespace std;
int ans;
set<int>s;
int main(){
int t, n, x;
cin >> t;
set<int>::iterator p1;
while(t--){
s.clear();
cin >> n >> x;
ans = x;
s.insert(x);
for(int i=2; i<=n; i++){
cin >> x;
p1 = s.lower_bound(x);//找>=x的数
int d1 = 66666, d2 = 66666;
if(p1 != s.end())//说明找到>=x的数
d1 = abs((*p1) - x);
if(p1 != s.begin()){//>=x的前一个数
--p1;
d2 = abs(x - (*p1));
}
ans += min(d1, d2);
s.insert(x);
}
cout << ans << endl;
}
return 0;
}