看題解的。。。就是將必須要修改的數去掉後求最長的不遞減子串行。
upper_bound+lower_bound要理解。有時候-1有時候不用是有原因的。
#include#include#include#includeusing namespace std;1294 修改陣列#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;
}
基準時間限制:1 秒 空間限制:131072 kb 分值: 160 難度:6級演算法題
收藏關注給出乙個整數陣列a,你可以將任何乙個數修改為任意乙個正整數,最終使得整個陣列是嚴格遞增的且均為正整數。問最少需要修改幾個數?
input
第1行:乙個數n表示序列的長度(1 <= n <= 100000)。output第2 - n + 1行:每行1個數,對應陣列元素。(0 <= a[i] <= 10^9)
輸出最少需要修改幾個數使得整個陣列是嚴格遞增的。input示例
512234output示例
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求一次最長...