
正文
【CF】259 Div.1 B Little Pony and Harmony Chest
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
还蛮有趣的一道状态DP的题目。
/* 435B */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 const int maxn = ;
int mask[maxn];
bool visit[maxn];
int P[maxn];
const int m = ;
const int N = (<<m)+;
const int INF = 0x1f1f1f1f;
int dp[][N];
int path[][N];
int a[]; void init() {
int i, j, k = ; for (i=; i<maxn; ++i) {
if (!visit[i]) {
P[k++] = i;
for (j=i*i; j<maxn; j+=i)
visit[j] = true;
}
} for (i=; i<maxn; ++i) {
for (j=; j<m; ++j) {
if (i%P[j] == ) {
mask[i] |= (<<j);
}
}
} #ifndef ONLINE_JUDGE
printf("P[%d] = %d\n", m, P[m]);
#endif
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif init();
int n; scanf("%d", &n);
rep(i, , n+)
scanf("%d", &a[i]); int i, j, k;
int st, tmp;
int mxs = <<; memset(dp, 0x1f, sizeof(dp));
memset(dp[], , sizeof(int)*N);
for (i=; i<=n; ++i) {
for (j=; j<mxs; ++j) {
for (k=; k<=; ++k) {
if (j & mask[k])
continue;
tmp = dp[i-][j] + abs(a[i] - k);
st = j | mask[k];
if (dp[i][st] > tmp) {
dp[i][st] = tmp;
path[i][st] = k;
}
}
}
} int mn = INT_MAX, v; for (j=; j<mxs; ++j) {
if (dp[n][j] < mn) {
mn = dp[n][j];
v = j;
}
} vi ans; for (i=n; i>; --i) {
k = path[i][v];
ans.pb(k);
v ^= mask[k];
} for (i=n-; i>=; --i)
printf("%d ", ans[i]);
putchar('\n'); #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}







