51nod1294 修改陣列

2022-03-30 15:43:21 字數 953 閱讀 5915

看題解的。。。就是將必須要修改的數去掉後求最長的不遞減子串行。

upper_bound+lower_bound要理解。有時候-1有時候不用是有原因的。 

#include#include#include#includeusing namespace std;

#define rep(i,s,t) for(int i=s;i<=t;i++)

#define dwn(i,s,t) for(int i=s;i>=t;i--)

#define clr(x,c) memset(x,c,sizeof(x))

int read()

const int nmax=1e5+5;

const int inf=0x7f7f7f7f;

int dp[nmax],a[nmax];

int main()

fill(dp+1,dp+cnt+1,inf);

rep(i,1,cnt)

printf("%d\n",ans+cnt-(lower_bound(dp+1,dp+cnt+1,inf)-dp-1));

return 0;

}

1294 修改陣列

基準時間限制:1 秒 空間限制:131072 kb 分值: 160 難度:6級演算法題

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

input

第1行:乙個數n表示序列的長度(1 <= n <= 100000)。

第2 - n + 1行:每行1個數,對應陣列元素。(0 <= a[i] <= 10^9)

output

輸出最少需要修改幾個數使得整個陣列是嚴格遞增的。
input示例

512234

output示例

3

51Nod 1294 修改陣列

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

51Nod 1294修改陣列

給出乙個整數陣列a,你可以將任何乙個數修改為任意乙個正整數,最終使得整個陣列是嚴格遞增的且均為正整數。問最少需要修改幾個數?大佬題解 首先可以明確一點,乙個最小的嚴格遞增的正整數子串行為1,2,3,n,那麼對於題目給出的任何乙個序列,需要最少改變多少個使得序列變為嚴格遞增的子串行呢?對於每乙個數a ...

51nod 1294 修改陣列 dp

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