E. Arithmetic Operations 題解(分類討論)
阿新 • • 發佈:2022-03-21
題目連結
題目思路
看一眼資料範圍和時間限制,很容易想到複雜度為\(O(n\sqrt n)\)
有點不太會寫,要採用按照公差大小分類討論
假如公差小於\(\sqrt {10^5}\)
那麼直接暴力計算\(a[i]=a[i]-(i-1)*d\) 判斷哪個數出現的次數最多即可
假如公差大於\(\sqrt{10^5}\)
那麼以\(a[i]\)為起點,長度最多\(\sqrt{10^5}\)
程式碼
#include<bits/stdc++.h> #define fi first #define se second #define debug cout<<"I AM HERE"<<endl; using namespace std; typedef long long ll; const int maxn=1e8+5,inf=0x3f3f3f3f,mod=1e9+7; const double eps=1e-6; int n; int a[100000+5]; int c=320,yi=5e7; int cnt[maxn]; signed main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } int ma=0; for(int i=-c;i<=c;i++){ for(int j=1;j<=n;j++){ cnt[a[j]+(j-1)*i+yi]++; ma=max(ma,cnt[a[j]+(j-1)*i+yi]); } for(int j=1;j<=n;j++){ cnt[a[j]+(j-1)*i+yi]=0; } } for(int i=1;i<=n;i++){ for(int j=i+1;j<=min(n,i+c);j++){ if((a[j]-a[i])%(j-i)!=0) continue; cnt[(a[j]-a[i])/(j-i)+yi]++; ma=max(ma,cnt[(a[j]-a[i])/(j-i)+yi]+1); } for(int j=i+1;j<=min(n,i+c);j++){ if((a[j]-a[i])%(j-i)!=0) continue; cnt[(a[j]-a[i])/(j-i)+yi]=0; } } printf("%d\n",n-ma); return 0; }