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 

题目大意:

给出N个数ai,求出还有一个序列bi。要求sum |ai-bi|,最短,且全部的bi都互质。

解法:

这里题目给了几个非常显眼的条件。ai限制在了1~30之间。因为能够bi无限选1这个数。那么|ai-bi| 最大就是29了,意味着bi < 59的。

要求全部的bi互质,能够化为全部的bi分解出来的质因数均不同样。bi < 59,有16个质数。这里我们非常easy联想到状态压缩DP了。

用s表示当前阶段用了哪些质因数的状态,比如 s = 3 = 11 代表眼下状态下使用了第一个和第二个质因数。

非常快我们就能够写出状态转移方程:

f[i][s] = min(f[i-1][s^c[k]] + abs(a[i] - k))。    当中c[k]表示数字k使用了哪些质因数。

代码:

#include <cstdio>
#include <cmath>
#include <cstring>
#define M_max 60
#define N_max 123
#define inf 0x3f3f3f3f using namespace std; int p[N_max], c[M_max], a[N_max];
int f[N_max][1<<16], pre[N_max][1<<16][2];
int n, cnt, minnum, minpos; void prime() {
for (int i = 2; i <= M_max; i++) {
bool flag = false; for (int j = 2; j <= sqrt(i); j++)
if (i%j == 0) {
flag = true;
break;
} if (!flag) p[++cnt] = i;
} for (int i = 1; i <= M_max; i++)
for (int j = 1; j <= cnt; j++)
if (i%p[j] == 0)
c[i] |= 1 << (j-1);
} void init() {
prime();
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
} void print(int x, int pos) {
if (x == 0) return;
print(x-1, pre[x][pos][0]);
printf("%d ", pre[x][pos][1]);
} void solve() {
memset(f, inf, sizeof(f));
memset(f[0], 0, sizeof(f[0]));
minnum = inf; for (int i = 1; i <= n; i++)
for (int s = 0; s < (1<<16); s++)
for (int k = 1; k <= M_max; k++)
if ((s&c[k]) == c[k]) {
int tmp = f[i-1][s^c[k]] + abs(a[i]-k); if (tmp < f[i][s]) {
f[i][s] = tmp;
pre[i][s][0] = s^c[k];
pre[i][s][1] = k;
}
}
for (int s = 0; s < (1<<16); s++)
if (f[n][s] < minnum) {
minnum = f[n][s];
minpos = s;
} print(n, minpos);
} int main() {
init();
solve();
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

codeforces Round #259(div2) D解决报告的更多相关文章

  1. codeforces Round #259(div2) E解决报告

    E. Little Pony and Summer Sun Celebration time limit per test 1 second memory limit per test 256 meg ...

  2. codeforces Round #260(div2) D解决报告

    D. A Lot of Games time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  3. codeforces Round #259(div2) C解题报告

    C. Little Pony and Expected Maximum time limit per test 1 second memory limit per test 256 megabytes ...

  4. codeforces Round #258(div2) D解题报告

    D. Count Good Substrings time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  5. Codeforces Round #259(div2)C(数学期望)

    数学题. 关键是求最大值为k时有多少种情况,结果是kn-(k-1)n-1.可以这么想:每一次都从1至k里选,共kn种,这里需要再减去每一次都从1至k-1里面选的情况.当然也可以分类计数法:按出现几次k ...

  6. codeforces Round #258(div2) C解题报告

    C. Predict Outcome of the Game time limit per test 2 seconds memory limit per test 256 megabytes inp ...

  7. Codeforces Round#320 Div2 解题报告

    Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...

  8. Codeforces Round #539 div2

    Codeforces Round #539 div2 abstract I 离散化三连 sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin ...

  9. 【前行】◇第3站◇ Codeforces Round #512 Div2

    [第3站]Codeforces Round #512 Div2 第三题莫名卡半天……一堆细节没处理,改一个发现还有一个……然后就炸了,罚了一啪啦时间 Rating又掉了……但是没什么,比上一次好多了: ...

随机推荐

  1. springboot(十四):springboot整合shiro-登录认证和权限管理(转)

    springboot(十四):springboot整合shiro-登录认证和权限管理 .embody{ padding:10px 10px 10px; margin:0 -20px; border-b ...

  2. Ubuntu下成功安装QQ2013

    阳光小强最近用Win8系统感觉特别不爽,中午果断换了一个win7系统,又想着能不能搞个双系统(最近在看一些linux东西),于是就开始整起来.结果并不好,linux虽然整好了,但是硬盘全部格式化了,当 ...

  3. keepalived小结

    keepalived 启动流程: 启动三个进程(主进程.healthcheck 进程.vrrp进程)之后,先进入backup状态,运行一次vrrp_script成功后发现没有主,这时候会进入maste ...

  4. UUIDUtils工具类

    原理是根据自身的操作系统和电脑硬件生成的一个32位的随机字符串,如果是一台电脑使用的话,一年不会重复,经过java之后貌似编程了36位,多了4个"-",下面是代码实现: impor ...

  5. 【前端统计图】echarts实现单条折线图

    五分钟上手: 图片.png <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  6. Java IO流经典练习题(mark用)

    一.练习的题目 (一) 在电脑D盘下创建一个文件为HelloWorld.txt文件,判断他是文件还是目录,在创建一个目录IOTest,之后将HelloWorld.txt移动到IOTest目录下去:之后 ...

  7. AngularJs压缩时须要注意的事项

    因为AngularJS是通过控制器构造函数的參数名字来判断依赖服务名称的.所以假设你要压缩控制器的JS代码.它全部的參数也同一时候会被压缩,这时候依赖注入系统就不能正确的识别出服务了. 假如我们的Co ...

  8. [Ramda] Get Deeply Nested Properties Safely with Ramda's path and pathOr Functions

    In this lesson we'll see how Ramda's path and pathOr functions can be used to safely access a deeply ...

  9. 第六章:任务执行——Java并发编程实战

    任务:通常是一些抽象的且离散的工作单元.大多数并发应用程序都是围绕"任务执行"来构造的,把程序的工作分给多个任务,可以简化程序的组织结构便于维护 一.在线程中执行任务 任务的独立性 ...

  10. X Window 简单的新手教程

    1.X Window 系统的窗体显示原理: http://www.ibm.com/developerworks/cn/linux/l-cn-xwin/ 2.X Window 程式设计入门--第二章 X ...