题目大意
给定长度为n的数组中不能出现
a
=
2
b
a=2b
a=2b
问最少删除多少个元素
题解
从
1
1
1到
1
0
6
10^6
106排列开,其中
a
=
2
b
a=2b
a=2b
d
p
[
i
]
[
0
]
dp[i][0]
dp[i][0] 奇数
d
p
[
i
]
[
1
]
dp[i][1]
dp[i][1] 偶数
当
i
i
i 为奇数时, 直接记录。为偶数时, 判断一下前面的数是否扣掉再加
代码
#include <iostream>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define fep(i,a,b) for(int i=a;i>=b;--i)
const int N = 1e6;
int arr[N+10], dp[N+10][2];
void solve()
{
int n,m;
cin >> n;
rep(i,1,n) {
cin >> m;
arr[m]++;
}
rep(i,1,N) {
if(i%2==1)
{
dp[i][0] = arr[i];
dp[i][1] = 0;
}
else
{
dp[i][0] = min(dp[i/2][0], dp[i/2][1])+arr[i];
dp[i][1] = dp[i/2][0];
}
}
int ans = 0;
for(int i=N;2*i>N;--i) ans += min(dp[i][0], dp[i][1]);
//fep(i,N,N/2)
cout << ans;
}
int main() {
solve();
return 0;
}