题解 P7273 【ix35 的等差数列】

lmrttx

2021-01-16 19:55:27

Personal

先赞美一下良心的出题人! 输出0得30分。 当然,这里讲一下正确的做法。 我们枚举公差 $d$,对于第 $i$ 个数,如果当前的首项为: $$a_i-d×(i-1)$$ 那么,这个数就处于当前的等差数列中,自然不用修改。 找出一组数据中,$a_i-d×(i-1)>0$ 的[众数](https://baike.baidu.com/item/%E4%BC%97%E6%95%B0/44796?fr=aladdin)所出现的次数,这个出现次数就是不需要修改的数的个数。 枚举 $d$ 就能跑过了。 用一个数组记录答案。 小优化: $d≤w/(n-1)$ (显然,根据题意) 所以枚举的范围缩小。 对了,枚举时写 $n-1$ 会RE一个点,因为,$n$ 可以等于1。 而亲测后发现枚举到 $w$ 会T到只有70。 所以写成 $w/n$ 就可以了。 贴代码啦! ```cpp int n,w,a[300001],t[300001],min1=2e9+10; int main(){ scanf("%d%d",&n,&w); for(register int i=1;i<=n;i++)scanf("%d",&a[i]),t[a[i]]++; for(int i=1;i<=n;i++)min1=min(min1,n-t[a[i]]); for(int d=1;d<=w/n;d++){ int cnt=0; for(int i=2;i<=n;i++){ if(a[i]-d*(i-1)!=a[1])cnt++; } min1=min(min1,cnt); } printf("%d",min1); return 0; } ``` 谢谢阅读qwq!