题目链接
D-小红的乘2除2_牛客周赛 Round 48 (nowcoder.com)
解析:
用DP来推,好理解,但是容易出错。
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
// int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
// typedef unsigned long long ULL;
typedef pair<int,int> PII;
// const double PI = acos(-1.0);
const int N=2e5+10;
int n;
int a[N];
int d[N][10];
/*
dp[i][0] 表示第i个数不操作,且之前未操作过
dp[i][1] 表示第i个数不操作,且之前进行过x操作
dp[i][2] 表示第i个数不操作,且之前进行过/操作
dp[i][3] 表示第i个数不操作,且之前进行了两次操作dp[i][4] 表示第i个数x操作,前i-1个数未操作
dp[i][5] 表示第i个数x操作,之前进行了/操作
dp[i][6] 表示第i个数/操作,之前没有操作
dp[i][7] 表示第i个数/操作,之前进行*操作
dp[i][8] 表示第i个数进行/*操作
*/
void solve()
{cin>>n;for (int i=1;i<=n;i++) cin>>a[i];d[1][1]=1e18;d[1][2]=1e18;d[1][3]=1e18;for (int i=2;i<=n;i++){int t=abs(a[i]-a[i-1]);d[i][0]=d[i-1][0]+t;d[i][1]=min(d[i-1][4]+abs(a[i-1]*2-a[i]),d[i-1][1]+t);d[i][2]=min(d[i-1][6]+abs(a[i-1]/2-a[i]),d[i-1][2]+t);d[i][3]=min({d[i-1][5]+abs(a[i-1]*2-a[i]),d[i-1][7]+abs(a[i-1]/2-a[i]),d[i-1][8]+abs(a[i-1]/2*2-a[i]),d[i-1][3]+t});d[i][4]=d[i-1][0]+abs(a[i]*2-a[i-1]);d[i][5]=min(d[i-1][6]+abs(a[i-1]/2-2*a[i]),d[i-1][2]+abs(a[i]*2-a[i-1]));d[i][6]=d[i-1][0]+abs(a[i-1]-a[i]/2);d[i][7]=min(d[i-1][4]+abs(a[i]/2-a[i-1]*2),d[i-1][1]+abs(a[i]/2-a[i-1]));d[i][8]=d[i-1][0]+abs(a[i]/2*2-a[i-1]);}cout<<min({d[n][3],d[n][5],d[n][7],d[n][8]});
}
signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T = 1;//cin >> T;while (T--) solve();return 0;
}