3561. 数螃蟹

kblack 在做数螃蟹的实验。按照「螃蟹爷爷的秘诀」一书上介绍的:由于东方神秘力量的影响,螃蟹的个数是一个完美的等差数列,例如:−2,−1,0,1,2,…。是的,kblack 的螃蟹比较神奇,有的时候螃蟹的个数可能会是负的。

kblack 每天都去池塘记录螃蟹的个数。但是 kblack 自己给自己放了最多三天的假(也有可能两天,有可能一天,有可能不放),放假的时候螃蟹个数的记录就是 kblack 口胡的,有的时候会假得有点过分。

现给出 kblack n 天的记录,记录中至多有三个数是错误的。请纠正错误并输出正确的实验记录。

输入格式
第一行是一个整数 n (3≤n≤105)。

第二行给出 n 个整数:a1,a2,…,an (|ai|≤109)。

输出格式
输出正确的实验记录:n 个整数 b1,b2,…,bn。输出应是一个等差数列,与输入的数列至多有三个数不同,且保证 |bi|≤1018。

题目保证有解。如果有多解输出任意一解。


```cpp

#include<iostream>
#include<map>
#define ll long long
using namespace std;
const int M = 1e5+1;
ll flag[M];
ll g[M];
map<ll,int>m;
int main() {
	int n;
	cin>>n;
	for(int i = 0; i < n; i++) {
		cin>>flag[i];
		if(i>0)
			m[flag[i]-flag[i-1]]++;
	}
	int M=0;
	int d;
	//找公差 
	for(map<ll,int>::iterator it=m.begin(); it!=m.end(); it++) {
		if(it->second>M) {
			M=it->second;
			d=it->first;
		}
	}
	int count=0;
	int i = 0;
	while(i<n-1) {
		while(flag[i+1]-flag[i]!=d)
		i++; //以此点开始向前向后枚举 每次枚举假设当前位置数据正确 
		count=0;
		g[i+1]=flag[i+1];
		for(int j = i; j >=0; j--) { //先前枚举使其公差为d 1 2 3 5 6 7 8 9 10
			g[j]=flag[j];
			if(g[j+1]-g[j]!=d) {
				g[j]=g[j+1]-d;
				count++;
			}
			if(count>3)
				break;
		}
		for(int j = i+1; j < n; j++) {//向后枚举使其公差为d 
			g[j]=flag[j];
			if(g[j]-g[j-1]!=d) {
				g[j]=g[j-1]+d;
				count++;
			}
			if(count>3)
				break;
		}
		if(count<=3) {
			break;
		}
		i++;
	}
	for(int i  = 0 ; i < n; i++)
		cout<<g[i]<<" ";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值