0
点赞
收藏
分享

微信扫一扫

G - Two Merged Sequences(dp&贪心)


G - Two Merged Sequences(dp&贪心)

思路1.贪心

维护两个序列,若对于当前元素只能被加进一个序列中那么直接加入。

若都不能加入输出无解。 否则比较后一个元素

显然加入降序,更优。因为如果加入升序,那么只能加入降序。

加入降序,后面可以加入更多数,且升序序列也能加入更多数。

显然加入升序,更优。证明同理。

时间复杂度:

#include <bits/stdc++.h>
using namespace std;

int main() {
int n;
cin >> n;
int a[n];
for (int i = 0; i < n; i++)
cin >> a[i];
int inc = -1, dec = 1e9;
for (int i = 0; i < n; i++)
if (inc < a[i] && (a[i] < a[i + 1] || a[i] >= dec))
inc = a[i], a[i] = 0;
else if (dec > a[i])
dec = a[i], a[i] = 1;
else
return cout << "NO\n", 0;
cout << "YES\n";
for (int i = 0; i < n; i++)
cout << a[i] << ' ';
}

思路2 dp

G - Two Merged Sequences(dp&贪心)_贪心算法_13

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x7f7f7f7f;
int a[200005];
int dp[200005][2];
int op[200005][2];
int opt[200005];
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
dp[1][1] = inf, dp[1][0] = -inf;
for (int i = 2; i <= n; i++)
{
dp[i][1] = -inf, dp[i][0] = inf;
if (a[i - 1] < a[i] && dp[i][1] < dp[i - 1][1])
{
dp[i][1] = dp[i - 1][1];
op[i][1] = 1;
}
if (dp[i - 1][0] < a[i] && dp[i][1] < a[i - 1])
{
dp[i][1] = a[i - 1];
op[i][1] = 0;
}
if (a[i - 1] > a[i] && dp[i][0] > dp[i - 1][0])
{
dp[i][0] = dp[i - 1][0];
op[i][0] = 0;
}
if (dp[i - 1][1] > a[i] && dp[i][0] > a[i - 1])
{
dp[i][0] = a[i - 1];
op[i][0] = 1;
}
}
if (dp[n][1] != -inf)
{
printf("YES\n");
for (int i = n, optmp = 1; i >= 1; i--)
{
opt[i] = optmp;
optmp = op[i][optmp];
}
for (int i = 1; i <= n; i++)
{
printf("%d ", opt[i] != 1);
}
}
else if (dp[n][0] != inf)
{
printf("YES\n");
for (int i = n, optmp = 0; i >= 1; i--)
{
opt[i] = optmp;
optmp = op[i][optmp];
}
for (int i = 1; i <= n; i++)
{
printf("%d ", opt[i] != 1);
}
}
else
printf("NO");
return 0;
}


举报

相关推荐

0 条评论