Arithmetic Operations(CF 1654 E)

传送门

题目大意

给你一个序列,问最少的把一个数改成其他任意数的操作数使得这个序列变成一个等差数列。(1n105,1ai105)

思路

很容易就能想到把这个问题转化为一个二维平面上求一条直线能经过最多点的问题,但是由于纵坐标会很大,所以不能直接暴力枚举斜率,但是我们又能想到当斜率很大时,肯定不会有很多点被经过,所以对于小斜率我们可以直接暴力枚举,然后对于大斜率,我们两两之间进行枚举,然后就能轻松AC了。不过至于什么是小斜率,那就设的稍微小一点,20~50之间都行吧。

代码

#include<bits/stdc++.h>
using namespace std;
const int t=30;
int a[100005];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	int ans=0;
	for(int i=-t;i<=t;i++)
	{
		map<int,int>cnt;
		for(int j=1;j<=n;j++)
			ans=max(ans,++cnt[a[j]-i*j]);
	}
	for(int i=1;i<=n;i++)
	{
		map<int,int>cnt;
		int r=100000/t;
		for(int j=i+1;j-i<=r&&j<=n;j++)
		{
			int d=a[j]-a[i];
			if(d%(j-i))continue;
			d/=(j-i);
			ans=max(ans,++cnt[d]+1);
		}
	}
	printf("%d\n",n-ans);
	return 0;
}

__EOF__

本文作者Jerry-Black
本文链接https://www.cnblogs.com/Jerry-Black/p/16037922.html
关于博主:小蒟蒻一只( ̄^ ̄)ゞ
版权声明:转载请注明来源哟~ QAQ
声援博主:UP UP UP !!!
posted @   Jerry_Black  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示