タイトルリミット
1500ミリ秒128 M
タイトル説明
冒険ハチェット銀河は、ジムと彼のレンジャーズは攻撃の群れを負いました。無深刻に彼の軍隊を指揮するジム・卓越した能力
状況の足の下にはスウォームの繰り返し攻撃との戦いのまま。しかし同時にジムの兵士の一部は、以下のサービスではなく、それらをサポートするのに十分なエネルギーを戦って
継続的な戦い。より多くの消火のために、ジムは誰もが戦闘に参加できるように、すべての兵士のエネルギーを分割することを決めました。
ジムN海兵隊が知られている、ジムは、n個の兵士によって円、すべての兵士のエネルギーの和nの倍数であり、各送信囲まする
だけエネルギー伝達ユニット。さらに悪いことに、充電ケーブルの長さは、あなたが唯一のkビットによって分離することができる手段、固定された
2つのエネルギー交換。
ヒューハイペリオン番号が軌道から落下することは非常に長い時間を要し、ジムは最速タイムでの転送の最小数を知りたいです。
入力フォーマット
正の整数の最初の二つの行為のN、K、Nの合計海兵隊を表します。(N <= 500000、K < = N)
nは正の整数ヴァル[1] -Val [n]を含む2行目の 、 各海兵隊エネルギーを表す(ヴァルを[I] <= 1E8 )
最終結果を使用することができることを確認64ビット整数格納されている
出力形式
周波数と出力透過極小。データが分割均等にすべてのエネルギーに保証されています。
データ範囲は、
データの25%が保証され、N <= 10れるため、
データの50%がそのN <= 2000確実にするために
データの100%保証するために、N <= 500000
サンプル入力
。4. 1
。1 3 9 7
出力サンプル
6
サンプルは、説明
例を、1397年あたりそれぞれ4つのエネルギーがので、2つの隣接するエネルギー交換ことがある
[1,3,9,7]→[5,3,5,7](4回)
[5,3,5,7]→[5,5,5,5](2回)
答えは6回です
リング全体は、個々のキャンディ古典的な伝達をモデル化するために複数のリングに分割されています
https://blog.csdn.net/weixin_34238642/article/details/94200423
私は、このモデルを書いていない、すべての突然、別の類似した古典のだと思うのは、私はその質問私の空想の成功を果たしました。。。。。
手の測定は、すぐに暴力回らないところを発見しました。。。
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int N=500005; 5 int n,k,val[N]; bool vis[N]; 6 int m; long long ans,a[N],b[N],sum[N]; 7 inline long long hehe() 8 {long long aver=0; 9 for(int i=1;i<=m;i++) aver+=a[i]; 10 aver/=m; 11 12 for(int i=1;i<m;i++) b[i]=aver-a[i+1],sum[i]=sum[i-1]+b[i]; 13 14 sum[m]=0; 15 sort(sum+1,sum+m+1); // 1--m 16 long long x=sum[(m+1)/2],re=0; 17 for(int i=1;i<=m;i++) re+=abs(x-sum[i]); 18 19 return re; 20 } 21 int main() 22 { 23 scanf("%d%d",&n,&k); 24 for(int i=1;i<=n;i++) scanf("%d",&val[i]); 25 26 for(int i=1;i<=n;i++) 27 {if(vis[i]) continue; 28 m=0; 29 for(int j=i;;j=(j+k)%n+1) 30 {if(vis[j]) break; 31 vis[j]=1; a[++m]=val[j]; //printf("%lld ",a[m]); 32 } 33 //printf("\n"); 34 ans+=hehe(); 35 } 36 printf("%lld",ans); 37 return 0; 38 }