P1732 [TJOI2011]序列

题目描述
一指数列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;
}

猜你喜欢

转载自blog.csdn.net/qq_39053800/article/details/104771489