codeforces Round #259(div2) 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
题目大意:
给出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解决报告的更多相关文章
- codeforces Round #259(div2) E解决报告
E. Little Pony and Summer Sun Celebration time limit per test 1 second memory limit per test 256 meg ...
- 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 ...
- codeforces Round #259(div2) C解题报告
C. Little Pony and Expected Maximum time limit per test 1 second memory limit per test 256 megabytes ...
- codeforces Round #258(div2) D解题报告
D. Count Good Substrings time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- Codeforces Round #259(div2)C(数学期望)
数学题. 关键是求最大值为k时有多少种情况,结果是kn-(k-1)n-1.可以这么想:每一次都从1至k里选,共kn种,这里需要再减去每一次都从1至k-1里面选的情况.当然也可以分类计数法:按出现几次k ...
- codeforces Round #258(div2) C解题报告
C. Predict Outcome of the Game time limit per test 2 seconds memory limit per test 256 megabytes inp ...
- Codeforces Round#320 Div2 解题报告
Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...
- Codeforces Round #539 div2
Codeforces Round #539 div2 abstract I 离散化三连 sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin ...
- 【前行】◇第3站◇ Codeforces Round #512 Div2
[第3站]Codeforces Round #512 Div2 第三题莫名卡半天……一堆细节没处理,改一个发现还有一个……然后就炸了,罚了一啪啦时间 Rating又掉了……但是没什么,比上一次好多了: ...
随机推荐
- [array] leetCode-15. 3Sum-Medium
leetCode-15. 3Sum-Medium descrition Given an array S of n integers, are there elements a, b, c in S ...
- matplotlib学习之散点图与条形图
# coding:utf-8 from matplotlib import pyplot as plt import numpy as np plt.style.use('ggplot') x = n ...
- JavaScript的Math对象
原文 简书原文:https://www.jianshu.com/p/8776ec9cfb58 大纲 前言 1.Math对象的值属性 2.Math对象的函数属性 3.Math对象的函数的使用 前言 Ma ...
- Vue源码--解读vue响应式原理
原文链接:https://geniuspeng.github.io/2018/01/05/vue-reactivity/ Vue的官方说明里有深入响应式原理这一节.在此官方也提到过: 当你把一个普通的 ...
- 在Linux上安装及配置MariaDB
安装MariaDB 1.切换到root用户,首先执行rpm -qa | grep -i mysql检查一下是否有已安装的与MySQL相关的东西,如果有,使用rpm -e --nodeps mysql* ...
- iOS开发webView的使用一
#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutl ...
- 修改Linux中的用户名 分类: B3_LINUX 2014-07-24 11:40 440人阅读 评论(0) 收藏
需要修改2个文件: /etc/hosts /etc/sysconfig/network 然后重启 1.修改/etc/sysconfig/network NETWORKING=yes HOSTNAME= ...
- Error while trying to retrieve text for error ORA-12705
今天, 按照以前的学习笔记, 配置ProC 但是, 却发生了如题的错误. Google一下, 都是NLS_LANG环境变量设置有问题, 我核一下没有问题. 问题在哪? 原来是ORACLE_HOME环境 ...
- Web开发之分页算法,N(N>=3)种解决方案
在Web开发中,分页是最常用的一个功能了.但是,想简单.灵活.方便地解决分页这个问题,还是需要动点脑筋的. 今天,简要梳理下,过去6年中,亲自遇到的分页问题和解决办法. 1. 定义问题 原由:在页面中 ...
- DOM常用的四大对象是什么?
DOM常用的四大对象是什么? 一.总结 一句话总结: 1.关注结构,关注主干 2.从主干处着手的话,可以发现dom就是四个东西,document(文档),element,attribute,event ...