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. [WASM] Compile C Code into WebAssembly

    We use the C language instead of pure WAST to create a square root function using WASM Fiddle (https ...

  2. java.util.logging使用笔记2

      java.util.logging是java自带的日志处理系统,其功能不如log4j/logback强大,但可以完成基本的日志需求. 另外,如果在一个项目中使用log4j, 而这个项目引用的第3方 ...

  3. 《SPA设计与架构》之客户端路由

    原文 简书原文:https://www.jianshu.com/p/4d83475f71da 大纲 1.传统路由 2.SPA导航 3.客户端路由器的工作机制 1.传统路由 在传统Web应用程序中,导航 ...

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

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

  5. [Vue] Import component into page

    Components are one of the most powerful features of Vue. Let's take a look at how to write our first ...

  6. 【u025】贝茜的晨练计划

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行N(1 <= ...

  7. ArcEngine中最短路径的实现

    原文 ArcEngine中最短路径的实现 最短路径分析属于ArcGIS的网络分析范畴.而ArcGIS的网络分析分为两类,分别是基于几何网络和网络数据集的网络分析.它们都可以实现最短路径功能.下面先介绍 ...

  8. Java程序猿的JavaScript学习笔记(5——prototype和Object内置方法)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  9. [Django] Creating an app, models and database

    To add a new app, first cd to the project. Then run: python manage.py startapp scrumboard After that ...

  10. CoreLocation定位

    nCoreLocation   n简介 n在移动互联网时代,移动app能解决用户的很多生活琐事,比如 p导航:去任意陌生的地方 p周边:找餐馆.找酒店.找银行.找电影院 p n在上述应用中,都用到了地 ...