Educational Codeforces Round 127 (Rated for Div. 2) D. Insert a Progression

6 篇文章 0 订阅
2 篇文章 0 订阅

D. Insert a Progression

思路:本题要发现只要插好1x后,其余的数插到数组里面是不会产生贡献的。所以现在的问题转化为1x怎么差产生的贡献最少?

设原数组中最小的值为 m i n min min,最大的值为 m a x max max

如果 1 = = m i n 1 == min 1==min则可以把1放在最小值边上不会产生贡献,同理把x < max,也不会产生贡献。

考虑 x > m a x x > max x>max 1 < m i n 1 < min 1<min的情况:

肯定能想到优先把1x放在原数组中数最大和最小的边上,如果最大值和最小值两边都还有数那么产生的贡献是 a b s ( 1 − m i n ) ∗ 2 abs(1 - min) * 2 abs(1min)2 a b s ( x − m a x ) ∗ 2 abs(x - max) * 2 abs(xmax)2,这样的贡献是两倍的,那么我们也可以把他们插到原数组第一个前面和最后一个后面,这样产生的贡献不用乘 2 2 2,我们把所有的情况产生的贡献取个最小值即可。

void solve()
{
	scanf("%d %d",&n,&x);
	vector<int>a;
	LL ans = 0;
	for(int i = 1; i <= n; i ++ ){
		int xx;
		cin >> xx;
		a.pb(xx);
	}
	int sa = sz(a);
	for(int i = 0; i + 1 < sa; i ++ ){
		ans += abs(a[i + 1] - a[i]);
	}
	int xx = *max_element(all(a)), yy = *min_element(all(a));
	int q = min({abs(1 - yy) * 2, abs(1 - a.front()), abs(1 - a.back())});
	int p = 0;
	if(xx < x) p = min({abs(x - xx) * 2, abs(x - a.front()), abs(x - a.back())});
	ans += p + q;
	cout << ans << endl;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值