acwing周赛140 b题

该篇文章讨论了一个编程问题,涉及如何在给定数组中找到连续子序列,使它们之间的差值最大,通过定义三个函数ans1(),ans2(),ans3()分别处理+1,0,-1的公差情况,并利用排序和逆转数组策略优化求解。
摘要由CSDN通过智能技术生成

思路:我们按照从小到大的顺序将数组逆转好,然后枚举数组首项,分别让其+1,-1,+0,然后求出公差,从前往后遍历即可。

代码:

int ans1(){//不动
	int cha = (a[n] - a[1] + 1) / (n - 1);
	int t = a[1];
	int cnt = 0;
	for(int i = 2;i <= n;i ++){
		t += cha;
		if(abs(t - a[i]) > 1)
			return 0x3f3f3f3f;
		if(t != a[i])
			cnt ++;
	}
	return cnt;
}

int ans2(){//+1
	int cha = (a[n] - a[1]) / (n - 1);
	int t = a[1] + 1;
	int cnt = 1;
	for(int i = 2;i <= n;i ++){
		t += cha;
		if(abs(t - a[i]) > 1)
			return 0x3f3f3f3f;
		if(t != a[i])
			cnt ++;
	}
	return cnt;
}

int ans3(){//-1
	int cha = (a[n] - a[1] + 2) / (n - 1);
	int t = a[1] - 1;
	int cnt = 1;
	for(int i = 2;i <= n;i ++){
		t += cha;
		if(abs(t - a[i]) > 1)
			return 0x3f3f3f3f;
		if(t != a[i])
			cnt ++;
	}
	return cnt;
}

void solve(){
	cin >> n;
	vector<int>b(n + 1);
	for(int i = 1;i <= n;i ++)
		cin >> a[i], b[i] = a[i];
	sort(b.begin() + 1,b.end());
	if(a[1] > a[n])reverse(a + 1,a + 1 + n);
	if(n <= 2){
		cout << 0;
		return;
	}
	int ans = min({ans1(),ans2(),ans3()});
	if(b[1] == b[n])ans = 0;
	if(ans > n)
		cout << -1;
	else
		cout << ans;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

临江浪怀柔ℳ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值