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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值