D. Little Pony and Harmony Chest
time limit per test

4 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Princess Twilight went to Celestia and Luna's old castle to research the chest from the Elements of Harmony.

A sequence of positive integers bi is harmony if and only if for every two elements of the sequence their greatest common divisor equals 1. According to an ancient book, the key of the chest is a harmony sequence bi which minimizes the following expression:

You are given sequence ai, help Princess Twilight to find the key.

Input

The first line contains an integer n (1 ≤ n ≤ 100) — the number of elements of the sequences a and b. The next line contains n integersa1, a2, ..., an (1 ≤ ai ≤ 30).

Output

Output the key — sequence bi that minimizes the sum described above. If there are multiple optimal sequences, you can output any of them.

Sample test(s)
input
5
1 1 1 1 1
output
1 1 1 1 1 
input
5
1 6 4 2 8
output
1 5 3 1 8 

sl : 很傻比的状态压缩,直接背包就搞了,又傻逼了。

// by caonima

// hehe
#include <bits/stdc++.h>
using namespace std;
const int MAX= ;
const int inf = 0x3f3f3f3f;
int dp[MAX][<<],val[MAX],a[MAX],ans[MAX][<<];
int prime[MAX],vis[MAX],cur=;
vector<int> C;
void init() {
    memset(vis,,sizeof(vis));
    vis[]=;
    for(int i=;i<;i++) {
        if(!vis[i]) prime[cur++]=i;
        for(int j=i;j<;j+=i) vis[j]=;
    }
    return ;
}
int main() {
    init();
    int n;
    while(scanf("%d",&n)==) {
        memset(val,,sizeof(val));
        for(int i=;i<=n;i++) {
            scanf("%d",&a[i]);
        }
        for(int i=;i<;i++) {
            for(int j=;j<cur;j++) {
                if(i%prime[j]==) {
                    val[i]|=(<<j);
                }
            }
        }
        for(int i=;i<=n;i++) {
            for(int j=;j<(<<cur);j++) dp[i][j]=inf;
        }
        for(int i=;i<(<<cur);i++) dp[][i]=;
        for(int i=;i<=n;i++) {
            for(int j=;j<(<<cur);j++) {
                for(int k=;k<;k++) {
                    if((j&val[k])==) {
                        int res=dp[i-][j^val[k]]+abs(k-a[i]);
                        if(res<dp[i][j]) {
                            dp[i][j]=res;
                            ans[i][j]=k;
                        }
                    }
                }
            }
        }
        int res=inf ,state;
        for(int i=;i<(<<cur);i++) {
            if(res>dp[n][i]) {
                res=dp[n][i];
                state=i;
            }
        }
     //   printf("%d\n",ans[n][0]);
        for(int i=n;i>=;i--) {
            C.push_back(ans[i][state]);
            int k=ans[i][state];
            state=state^(val[k]);
        }
        for(int i=C.size()-;i>=;i--) {
            printf("%d ",C[i]);
        }
        printf("\n");
    }
    return ;
}
#include <bits/stdc++.h>
#define debug() printf("sss");
using namespace std;
const int inf = 0x3f3f3f3f;
const int MAX = ;
int cur=,vis[MAX],prime[MAX],state[MAX];
vector<int> C;
int dp[MAX][<<],a[MAX],b[MAX],n,res[MAX][<<];
void init() {
    for(int i=;i<MAX;i++) {
        if(!vis[i]) prime[cur++]=i;
        for(int j=i;j<MAX;j+=i) vis[j]=;
    }
    memset(state,,sizeof(state));
    for(int i=;i<;i++) {
        for(int j=;j<;j++) {
            if(i%prime[j]==) state[i]|=(<<j);
        }
    }
}
int dfs(int pos,int s) {
    if(pos>n) return ;
    if(~dp[pos][s]) return dp[pos][s];
    int ans=inf;
    for(int i=;i<;i++) {
        if(s&state[i]) continue;
        int t=dfs(pos+,s|state[i])+abs(i-a[pos]);
        if(ans>t) {
            ans=t;
            res[pos][s]=i;
        }
    }
    return dp[pos][s]=ans;
}
int main() {
    init();

while(scanf("%d",&n)==) {
        for(int i=;i<=n;i++) {
            scanf("%d",&a[i]);
        }
        memset(dp,-,sizeof(dp));
        dfs(,);
        int s=;
       
        for(int i=;i<=n;i++) {
            C.push_back(res[i][s]);
            int k=res[i][s];
            s=s|(state[k]);
        }
        for(int i=;i<C.size();i++) {
            printf("%d ",C[i]);
        }
        printf("\n");
    }
}

Codeforces Round #259 (Div. 2) D的更多相关文章

  1. Codeforces Round #259 (Div. 2)AB

    链接:http://codeforces.com/contest/454/problem/A A. Little Pony and Crystal Mine time limit per test 1 ...

  2. Codeforces Round #259 (Div. 1) A. Little Pony and Expected Maximum 数学公式结论找规律水题

    A. Little Pony and Expected Maximum Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.c ...

  3. Codeforces Round #259 (Div. 2)

    A. Little Pony and Crystal Mine 水题,每行D的个数为1,3.......n-2,n,n-2,.....3,1,然后打印即可 #include <iostream& ...

  4. Codeforces Round #259 (Div. 2)-D. Little Pony and Harmony Chest

    题目范围给的很小,所以有状压的方向. 我们是构造出一个数列,且数列中每两个数的最大公约数为1; 给的A[I]<=30,这是一个突破点. 可以发现B[I]中的数不会很大,要不然就不满足,所以B[I ...

  5. Codeforces Round #259 (Div. 2) C - Little Pony and Expected Maximum (数学期望)

    题目链接 题意 : 一个m面的骰子,掷n次,问得到最大值的期望. 思路 : 数学期望,离散时的公式是E(X) = X1*p(X1) + X2*p(X2) + …… + Xn*p(Xn) p(xi)的是 ...

  6. Codeforces Round #259 (Div. 2) C - Little Pony and Expected Maximum

    题目链接 题意:一个m个面的骰子,抛掷n次,求这n次里最大值的期望是多少.(看样例就知道) 分析: m个面抛n次的总的情况是m^n, 开始m==1时,只有一种 现在增加m = 2,  则这些情况是新增 ...

  7. Codeforces Round #259 (Div. 2) D. Little Pony and Harmony Chest 状压DP

    D. Little Pony and Harmony Chest   Princess Twilight went to Celestia and Luna's old castle to resea ...

  8. Codeforces Round #259 (Div. 1)A(公式)

    传送门 题意 给出m个面的骰子扔n次,取最大值,求期望 分析 暴力算会有重复,而且复杂度不对. 考虑m个面扔n次得到m的概率,发现只要减去(m-1)个面扔n次得到m-1的概率即可,给出example说 ...

  9. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

随机推荐

  1. 导出数据库报错 EXP-00002: 写入导出文件时出错 EXP-00000: 导出终止失败

    解决方法: 1.检查磁盘所在空间是否够用. 2.磁盘修复下 排除故障考虑的地方要全面啊.

  2. SecureCRT 迁移到新环境,导出配置文件目录 转

    SecureCRT 打开SecureCRT,点击菜单栏的“选项”--“全局选项” 在打开的窗口中,选择“常规”,在右侧找到“配置文件夹”,这个就是SecureCRT的配置文件目录. 复制这个路径并且进 ...

  3. Jquery插件jqprint-0.3.js实现打印

    1.首先引用Jquery和jqprint-0.3.js(依赖于Jquery的) <script language="javascript" src="jquery- ...

  4. AJPFX总结关于JVM的基础知识

    写在前面 之前老大让做一些外包面试,我的问题很简单: 介绍一下工作中解决过比较 有意思的问题. HashMap使用中需要注意的点. 第一个问题主要是想了解一下对方项目经验的含金量,第二个问题则是测试下 ...

  5. flex弹性布局操练2

    上一个是练习的1个内元素的,这次练习两个元素的. ul.box1 { list-style:none; background-color:black; display:flex; justify-co ...

  6. vue全局loading组件

    本组件作用在页面加载完成前进行loader提示,提升用户体验,只需要在app.vue中引用一次,整个项目中路由切换时就可以自动进行提示(vuex版): 1. 添加vuex值和方法: import Vu ...

  7. Android 在代码中安装 APK 文件

    废话不说,上代码 private void install(String filePath) { Log.i(TAG, "开始执行安装: " + filePath); File a ...

  8. vue路由细节探讨

    1.使用router-link 不会让页面刷新,使用a标签会使页面刷新.2.router-link 里面的to="/路由地址" tag=""自定义标签" ...

  9. vuex相关的知识

    vue的核心是store,它可以看作是一个容器,它包含着应用中的状态state(state,mutations,actions,getters, modules).它中的存储是响应式的,当store中 ...

  10. 【原创】webbluetoorh 在windows下无法显示搜索列表,在mac下正常的解决办法

    google webbluetooth在windows下不能弹出设备搜索列表提示“Web Bluetooth API is not available”,因为webbluetooth是google新推 ...