最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

codeforcesRound#259(div2)D解题报告_html/css

来源:动视网 责编:小采 时间:2020-11-27 15:57:03
文档

codeforcesRound#259(div2)D解题报告_html/css

codeforcesRound#259(div2)D解题报告_html/css_WEB-ITnose: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 ches
推荐度:
导读codeforcesRound#259(div2)D解题报告_html/css_WEB-ITnose: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 ches


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

51 1 1 1 1

output

1 1 1 1 1 

input

51 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个质数。这里我们很容易联想到状态压缩DP了。

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

很快我们就可以写出状态转移方程:

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

代码:

#include #include #include #define M_max 60#define N_max 123#define inf 0x3f3f3f3fusing 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();}

文档

codeforcesRound#259(div2)D解题报告_html/css

codeforcesRound#259(div2)D解题报告_html/css_WEB-ITnose: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 ches
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top