调整队列
Description
?這天小g遇到了一個(gè)隊(duì)列,小g覺得隊(duì)列亂糟糟的不好看。于是小g希望將隊(duì)列調(diào)整成為一個(gè)等差數(shù)列(差可為0)。但是小g對(duì)每個(gè)數(shù)都最多調(diào)整一次,每次可以對(duì)這個(gè)數(shù)加一、減一。請(qǐng)你幫助小g解決這個(gè)問題,如果能調(diào)整出等差隊(duì)列,輸出需要調(diào)整的數(shù)的最小數(shù)量,否則輸出-1。
?
Input
第一行一個(gè)整數(shù)n(2 <= n <= 100000),表示數(shù)列中數(shù)的個(gè)數(shù);
第二行為n個(gè)整數(shù)pi (1 <= pi <= 1e9)。
Output
輸出一個(gè)整數(shù),表示操作數(shù)量的最小值。如果不存在則輸出-1。
Sample Input
4 24 21 14 10 2 500 500 3 14 5 1 5 1 3 6 9 12Sample Output
3 0 -1 1HINT
?
?第一個(gè)隊(duì)列調(diào)整成[25,20,15,10]花費(fèi)三次操作
C++版本一
題解:
問最少修改幾次可以成為一個(gè)等差數(shù)列,等差數(shù)列由公差決定,因此只考慮前兩項(xiàng)即可確定整個(gè)數(shù)列。
#include<bits/stdc++.h> using namespace std; const int MAX_N = 3e5+9; const int INF = 1e9+9; int vec[MAX_N]; int res[MAX_N]; int N,M,T,S; queue<int> que;int main(){freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);while(cin>>N){for(int i=0;i<N;i++){scanf("%d",&vec[i]);}if(N==1 ||N==2){cout<<0<<endl;continue;}int ax = INF;for(int a=0;a<3;a++){for(int b =0;b<3;b++){int t = vec[1]+b-1 - (vec[0]+a-1);int pre = vec[1] + b - 1;bool f = true;int ans = abs(a-1)+abs(b-1);//cout<<pre<<"..."<<t<<"...."<<ans<<endl;for(int i=2;i<N;i++){int temp = vec[i] - pre;if(abs(temp - t) > 1) {//cout<<vec[i]<<".!!!!..."<<pre<<endl;f = false;break;}ans += abs(pre+t-vec[i]);pre = pre + t;}if(f) {ax = min(ax,ans);}}}if(ax != INF)cout<<ax<<endl;else cout<<-1<<endl;}}C++版本二
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <string.h> #include <cmath> #include <queue> using namespace std; typedef long long ll; const int N=100000+100; int t,n,m,ans; int a[N]; void bfs(int k,int c,int d){if(k>=n+1){if(ans==-1)ans=c;elseans=min(ans,c);return;}for(int i=-1;i<=1;i++){if((a[k]+i)-a[k-1]==d){a[k]+=i;if(i==0)bfs(k+1,c,d);elsebfs(k+1,c+1,d);a[k]-=i;}} }int main() {while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++)scanf("%d",&a[i]);ans=-1;for(int i=-1;i<=1;i++){a[1]+=i;for(int j=-1;j<=1;j++){a[2]+=j;bfs(3,abs(i)+abs(j),a[2]-a[1]);a[2]-=j;}a[1]-=i;}cout << ans << endl;}//cout << "Hello world!" << endl;return 0; }?
總結(jié)