Codeforces Round #259 (Div. 2) D
4 seconds
256 megabytes
standard input
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.
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 the key — sequence bi that minimizes the sum described above. If there are multiple optimal sequences, you can output any of them.
5
1 1 1 1 1
1 1 1 1 1
5
1 6 4 2 8
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 ;
}

#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的更多相关文章
- Codeforces Round #259 (Div. 2)AB
链接:http://codeforces.com/contest/454/problem/A A. Little Pony and Crystal Mine time limit per test 1 ...
- 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 ...
- Codeforces Round #259 (Div. 2)
A. Little Pony and Crystal Mine 水题,每行D的个数为1,3.......n-2,n,n-2,.....3,1,然后打印即可 #include <iostream& ...
- Codeforces Round #259 (Div. 2)-D. Little Pony and Harmony Chest
题目范围给的很小,所以有状压的方向. 我们是构造出一个数列,且数列中每两个数的最大公约数为1; 给的A[I]<=30,这是一个突破点. 可以发现B[I]中的数不会很大,要不然就不满足,所以B[I ...
- 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)的是 ...
- Codeforces Round #259 (Div. 2) C - Little Pony and Expected Maximum
题目链接 题意:一个m个面的骰子,抛掷n次,求这n次里最大值的期望是多少.(看样例就知道) 分析: m个面抛n次的总的情况是m^n, 开始m==1时,只有一种 现在增加m = 2, 则这些情况是新增 ...
- 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 ...
- Codeforces Round #259 (Div. 1)A(公式)
传送门 题意 给出m个面的骰子扔n次,取最大值,求期望 分析 暴力算会有重复,而且复杂度不对. 考虑m个面扔n次得到m的概率,发现只要减去(m-1)个面扔n次得到m-1的概率即可,给出example说 ...
- 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 ...
随机推荐
- API系列一:REST和RESTful认识
序言 最近工作的项目一直使用API,就想趁這个机会,把API的知识点进行一次梳理和总结,顺便提升一下自己对API全新的认识 Web API 是ASP.NET平台新加的一个特性,它可以简单快速地创建We ...
- robotframework + python2.7.9 + selenium 2.44.0 + selenium2library1.7 测试环境搭建成功!
真心不容易呀!开源软件搭建挺麻烦的,各种组件未必要使用最新的版本:有些最新版本反而不兼容.需要仔细看官方说明书来进行搭建(官方网站都是英文),所以闹得重新安装了几次. 先上测试用例通过的图:
- was--创建概要文件(典型)
1.第一步 2 .创建 3.创建 4 .典型 5 下一步 6 下一步 7.下一步 8.输入用户和密码,下一步 9.下一步 10.下一步 11.下一步 12.下一步 13.下一步 14.创建 ...
- linux查看内核版本和发行版本号
1.查看Linux内核版本号:1.1 uname -r #查看当前linux系统的内核版本号显示举例:2.6.21-1.3194.fc71.2 uname -a #可以查看包括内核版本号.机器硬件信息 ...
- JFinal项目eclipse出现Unknown column 'createtime' in 'order clause' 的错误
JFinal项目eclipse出现Unknown column 'createtime' in 'order clause' 的错误,在本次项目中的原因是我的表中的字段信息中创建时间的字段是creat ...
- iOS Development Sites
iOS Development Sites 学习iOS开发有一段时间了,虽然还处于迷茫期,但相比以前的小白痴状态,现在还是蛮有改观的.期间接触了一些很好的网站和博客,现在摘录下来,就当建个索引,没 ...
- css一个div设置多个背景图片
html:定义一个div <div class="item__content"></div> css:样式 .item__content { positio ...
- Linux中CentOS网络配置以及与Xshell建立远程连接
为centos配置网络 (1)第一步 点开虚拟机的设置,如下图做相关的设置: 网络连接要选择桥接模式,其他的勾选就按照上图的即可,勾选完成点击确定. (2)第二步 点击VMware的编辑选项,找到“虚 ...
- LAMP中添加多虚拟主机
在/etc/apache2/sites-available中默认有个default文件,其中的大致配置如下: <VirtualHost *:80> ServerAdmin xujie198 ...
- Vue实例方法之事件的实现
开始 这段时间一直在看vue的源码,源码非常多和杂,所以自己结合资料和理解理出了一个主线,然后根据主线去剥离其他的一些知识点,然后将各个知识点逐一学习.这里主要是分析的Vue事件处理的实现. 正文 一 ...