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 ...
随机推荐
- 题解报告:hdu 1431 素数回文
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1431 Problem Description xiaoou33对既是素数又是回文的数特别感兴趣.比如说 ...
- leaflet在地图上加载本地图片
<link href="~/Scripts/Leaflet/leaflet.css" rel="stylesheet" /><script s ...
- strings命令的实现 2014-06-02 00:17 355人阅读 评论(0) 收藏
本程序实现从文件中提取连续4个以上的可打印字符.模仿linux中string命令 #include <stdio.h> #include<stdlib.h> #include ...
- synchronized(5)修饰语句块之:synchronized(XXX.class)
synchronized(XXX.class)有两种写法 synchronized(XXX.class)或者synchronized(obj.getClass()) Class也是一个类xxx.cla ...
- Stamus Networks的产品SELKS(Suricata IDPS、Elasticsearch 、Logstash 、Kibana 和 Scirius )的下载和安装(带桌面版和不带桌面版)(图文详解)
不多说,直接上干货! SELKS是什么? SELKS 是Stamus Networks的产品,它是基于Debian的自启动运行发行,面向网络安全管理.它基于自己的图形规则管理器提供一套完整的.易于使 ...
- Toolbar自定义布局
Toolbar如何使用想必大家清楚地很,实际开发中标题栏的样式各色各样,因此其基本样式便不能满足我们的需求,这就需要我们自定义布局.打开ToolBar源码我们发现它继承ViewGroup,这就表示我们 ...
- React全家桶之一 react-router之高级
使用query获取URL中的参数 //引入相关的依赖 const Page = props => <div> <h1>{props.location.query.mess ...
- linux下mysql开启可访问
修改mysql配置连接信息 将bind-address注释 vim /etc/my.cnf 修改mysql用户授权 mysql>GRANT ALL PRIVILEGES ON *.* TO ' ...
- 在sql server 如何创建一个只读账户
设置步骤 进入Sqlserver Management Studio(MSSQL客户端) 选择安全性->登录名->右键新建登录名 在常规里输入用户名和密码 在"用户映射" ...
- Ghost Win10系统X64位和32位10041装机版下载
更多系统下载尽在系统妈:http://www.xitongma.com 特别说明: 1.C:盘分区须至少15GB(安装过程有大量的解压临时文件),安装完成后C:盘占用10GB左右! 2.安装之后如有硬 ...