缩进对齐
题目描述
有一段代码,共有 n 行,小爱需要调整这些代码的缩进长度。一开始,第 i 行代码的开头有 a[i]
个空格,小爱希望将这一行的开头调整成为 b[i]
个空格。
小爱的文本编辑器有一个功能,它可以选中任意多行连续的代码,通过一步操作就可以在这些行的开头增加或删除一个空格。注意,若选择删除一个行首空格,必须保证选中的每一行行首都至少有一个空格,不然文本编辑器会误删其他字符,程序就要出错了。
请问最少需要多少步,才能让这段代码的缩进调整成指定的样子?
输入格式
第一行:单个整数 n;
第二行到第 n+1 行:每行两个整数,表示 a[i]和b[i]
输出格式
单个整数:表示最少步数。
数据范围
对于 30% 的数据,n≤100;
对于 60% 的数据,n≤5000;
对于 100% 的数据,1≤n≤100,000,
10,0000≤a[i],b[i]≤10,000。
思路分析
(1). a[i]>0 的情况 :
(1.1)a[i-1]>0 的情况:
d p [ i ] = d p [ i − 1 ] − a [ i − 1 ] + m a x ( a [ i ] , a [ i − 1 ] ) dp[i]= dp[i-1] - a[i-1]+max(a[i],a[i-1])\\ dp[i]=dp[i−1]−a[i−1]+max(a[i],a[i−1])
(1.2) a[i-1]<=0 的情况
d p [ i ] = d p [ i − 1 ] + ∣ a [ i ] ∣ dp[i]=dp[i-1]+\left| a[i] \right| dp[i]=dp[i−1]+∣a[i]∣
(2). a[i]=0 的情况
d p [ i ] = d p [ i − 1 ] dp[i]=dp[i-1] dp[i]=dp[i−1]
(3).a[i]<0的情况
(3.1).a[i-1]<0
d p [ i ] = d p [ i − 1 ] − ∣ a [ i − 1 ] ∣ + m a x ( ∣ a [ i ] ∣ , ∣ a [ i − 1 ] ∣ ) dp[i]= dp[i-1] - \left |a[i-1] \right |+max(\left |a[i] \right |,\left |a[i-1] \right |) dp[i]=dp[i−1]−∣a[i−1]∣+max(∣a[i]∣,∣a[i−1]∣)
(3.2)a[i-1]>=0
d p [ i ] = d p [ i − 1 ] + ∣ a [ i ] ∣ dp[i]=dp[i-1]+\left| a[i] \right| dp[i]=dp[i−1]+∣a[i]∣
code
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 100010;
int p[N],dp[N];//p[N]元数组, dp【N】 前i个最小操作数。
int main()
{
int n, x, y;
cin >> n;
for (int i = 1; i <= n; i ++ ){
cin>>x>>y;
p[i]=(y-x);
}//输入差值数据存如p数组中。
dp[1]=abs(p[1]);//初始化
for (int i = 2; i <= n; i ++ )
{
if(p[i]>0)
{
if(p[i-1]>0)
{
dp[i] = dp[i-1]+ max(abs(p[i-1]),abs(p[i]))-abs(p[i-1]);
}
else
{
dp[i] = dp[i-1]+abs(p[i]);
}
}
else if(p[i]<0)
{
if(p[i-1]<0)
{
dp[i] = dp[i-1]+ max(abs(p[i-1]),abs(p[i]))-abs(p[i-1]);
}
else
{
dp[i] = dp[i-1]+abs(p[i]);
}
}
else dp[i]=dp[i-1];
}
cout << dp[n] << endl;
return 0;
}