51Nod 1294修改陣列

2021-09-18 04:17:25 字數 1760 閱讀 9846

給出乙個整數陣列a,你可以將任何乙個數修改為任意乙個正整數,最終使得整個陣列是嚴格遞增的且均為正整數。問最少需要修改幾個數?

(大佬題解)

首先可以明確一點,乙個最小的嚴格遞增的正整數子串行為1,2,3,……….n,那麼對於題目給出的任何乙個序列,需要最少改變多少個使得序列變為嚴格遞增的子串行呢? 對於每乙個數a[i],把a[i] 變為 a[i] - i,如果此時a[i]小於0,說明他連最小的嚴格遞增子串行都不符合,那麼它一定要修改,再處理完這些小於0的數後,剩下的數又應該怎麼操作呢? 直接求出最長的非嚴格遞增子串行就行了. 具體為什麼,和其它的數經過這樣操作都能夠換成合法的數,只能自己意會下噠!

由於資料量過大,這裡求最長公共子串行時,需要使用二分法搜尋,使得演算法的複雜度為 o(n·logn)

第一種,time limit exceed**,暴力搜尋

}第二種,ac**,使用二分法進行搜尋

#include

#include

#include

#include

#define maxn 100005

using namespace std;

int a[maxn]

;int d[maxn]

;int f[maxn]

;int

bsearch

(const

int*f,

int size,

const

int&a)

else

if(a < f[mid]

)else

}return-1

;}intlis

(const

int*a,

const

int&n)

else

if(a[i]

>= f[size -1]

)else

f[j]

= a[i]

; d[i]

= j +1;

}return size;

}int

main()

}int len=

lis(a,pos);if

(ans!=0)

else

printf

("%d\n"

,ans);}

return0;

}

51Nod 1294 修改陣列

acm模版 向大牛致敬 xdlove,思量許久,不能參透,大牛題解一語驚醒夢中人 首先可以明確一點,乙個最小的嚴格遞增的正整數子串行為1,2,3,n,那麼對於題目給出的任何乙個序列,需要最少改變多少個使得序列變為嚴格遞增的子串行呢?對於每乙個數a i 把a i 變為 a i i,如果此時a i 小於...

51nod1294 修改陣列

看題解的。就是將必須要修改的數去掉後求最長的不遞減子串行。upper bound lower bound要理解。有時候 1有時候不用是有原因的。include include include includeusing namespace std define rep i,s,t for int i ...

51nod 1294 修改陣列 dp

給出乙個整數陣列a,你可以將任何乙個數修改為任意乙個正整數,最終使得整個陣列是嚴格遞增的且均為正整數。問最少需要修改幾個數?n 100000,0 a i 10 9 我們可以注意到a i 最小的值是i,我們設b i a i i,那麼如果b i 0則位置i一定要修改。對於其餘的位置,我們就對b求一次最長...