目錄c++
描述:給定一個數組,每次能夠對數組某一個區間加一或者減一,求最少操做多少次可使數組所有元素一致,最終可能的序列有多少種。git
題解:可使用差分,先求一個差分數組,差分數組中正數總和位x,負數總和爲y。因爲只能加一或者減一操做(加m減m操做能夠一樣分析,暫時沒有想出怎麼解,只是感受能夠一樣分析)。全部最少操做次數爲min(x,y)(解釋:每次操做選取一正數一負數,正數減1負數加1)+abs(x-y)(剩下全正或者全負的狀況,只能和差分數組的第一項或者 最後一項匹配)。最終可能的序列有abs(x-y)+1(解釋:取決於最後全正或者全負狀況下的操做一共abs(x-y)步操做,對原數組第一項的操做可能有(0,1,2,abs(x-y)一共abs(x-y)+1中操做方式)數組
/* * @Author: yexm * @Date: $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE * @Time: $CURRENT_HOUR:$CURRENT_MINUTE:$CURRENT_SECOND * @Location: ${TM_FILENAME} Line_$TM_LINE_NUMBER */ //加減代替取模優化,多數組結構體優化,puts()輸出優化 #include <bits/stdc++.h> using namespace std; #define fre freopen("data.in","r",stdin); #define frew freopen("my.out","w",stdout); #define ms(a) memset((a),0,sizeof(a)) #define re(i,a,b) for(register int i=(a);(i)<(b);++(i)) #define ree(i,a,b) for(register int i=(a);(i)<=(b);++(i)) #define all(x) (x).begin(),(x).end() #define pb push_back #define lson l,m,i<<1 #define rson m+1,r,i<<1|1 #define reg register typedef long long LL; const int inf=(0x7f7f7f7f); inline void sf(int& x){ x=0;int w=0; char ch=0; while(!isdigit(ch)) {w|=ch=='-';ch=getchar();} while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); x=(w?-x:x); } inline void pf(int x){ if(x<0) putchar('-'),x=-x; if(x>9) pf(x/10); putchar(x%10+'0'); } const int maxn=1e5+5; int main(){ return 0; }
//支持正負整數 inline void sf(int& x){ x=0;int w=0; char ch=0; while(!isdigit(ch)) {w|=ch=='-';ch=getchar();} while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); x=(w?-x:x); } inline void pf(int x){ if(x<0) putchar('-'),x=-x; if(x>9) pf(x/10); putchar(x%10+'0'); }
1 int max(int a, int b){.....}//原函數 2 inline int max(int a, int b){....}//直接加inline就行了。
頻繁使用的變量,聲明時加上該register關鍵字,運行時放到CPU寄存器中,速度快。可是CPU寄存器空間小,變量多的時候,通常仍是丟到內存裏面的。數據結構
for(register int i=0,a=1;i<=99999999;i++) a++;
//設模數爲 mod inline int inc(int x,int v,int mod){x+=v;return x>=mod?x-mod:x;}//代替取模+ inline int dec(int x,int v,int mod){x-=v;return x<0?x+mod:x;}//代替取模-