还蛮有趣的一道状态DP的题目。

  1. /* 435B */
  2. #include <iostream>
  3. #include <string>
  4. #include <map>
  5. #include <queue>
  6. #include <set>
  7. #include <stack>
  8. #include <vector>
  9. #include <deque>
  10. #include <algorithm>
  11. #include <cstdio>
  12. #include <cmath>
  13. #include <ctime>
  14. #include <cstring>
  15. #include <climits>
  16. #include <cctype>
  17. #include <cassert>
  18. #include <functional>
  19. #include <iterator>
  20. #include <iomanip>
  21. using namespace std;
  22. //#pragma comment(linker,"/STACK:102400000,1024000")
  23.  
  24. #define sti set<int>
  25. #define stpii set<pair<int, int> >
  26. #define mpii map<int,int>
  27. #define vi vector<int>
  28. #define pii pair<int,int>
  29. #define vpii vector<pair<int,int> >
  30. #define rep(i, a, n) for (int i=a;i<n;++i)
  31. #define per(i, a, n) for (int i=n-1;i>=a;--i)
  32. #define clr clear
  33. #define pb push_back
  34. #define mp make_pair
  35. #define fir first
  36. #define sec second
  37. #define all(x) (x).begin(),(x).end()
  38. #define SZ(x) ((int)(x).size())
  39. #define lson l, mid, rt<<1
  40. #define rson mid+1, r, rt<<1|1
  41.  
  42. const int maxn = ;
  43. int mask[maxn];
  44. bool visit[maxn];
  45. int P[maxn];
  46. const int m = ;
  47. const int N = (<<m)+;
  48. const int INF = 0x1f1f1f1f;
  49. int dp[][N];
  50. int path[][N];
  51. int a[];
  52.  
  53. void init() {
  54. int i, j, k = ;
  55.  
  56. for (i=; i<maxn; ++i) {
  57. if (!visit[i]) {
  58. P[k++] = i;
  59. for (j=i*i; j<maxn; j+=i)
  60. visit[j] = true;
  61. }
  62. }
  63.  
  64. for (i=; i<maxn; ++i) {
  65. for (j=; j<m; ++j) {
  66. if (i%P[j] == ) {
  67. mask[i] |= (<<j);
  68. }
  69. }
  70. }
  71.  
  72. #ifndef ONLINE_JUDGE
  73. printf("P[%d] = %d\n", m, P[m]);
  74. #endif
  75. }
  76.  
  77. int main() {
  78. ios::sync_with_stdio(false);
  79. #ifndef ONLINE_JUDGE
  80. freopen("data.in", "r", stdin);
  81. freopen("data.out", "w", stdout);
  82. #endif
  83.  
  84. init();
  85. int n;
  86.  
  87. scanf("%d", &n);
  88. rep(i, , n+)
  89. scanf("%d", &a[i]);
  90.  
  91. int i, j, k;
  92. int st, tmp;
  93. int mxs = <<;
  94.  
  95. memset(dp, 0x1f, sizeof(dp));
  96. memset(dp[], , sizeof(int)*N);
  97. for (i=; i<=n; ++i) {
  98. for (j=; j<mxs; ++j) {
  99. for (k=; k<=; ++k) {
  100. if (j & mask[k])
  101. continue;
  102. tmp = dp[i-][j] + abs(a[i] - k);
  103. st = j | mask[k];
  104. if (dp[i][st] > tmp) {
  105. dp[i][st] = tmp;
  106. path[i][st] = k;
  107. }
  108. }
  109. }
  110. }
  111.  
  112. int mn = INT_MAX, v;
  113.  
  114. for (j=; j<mxs; ++j) {
  115. if (dp[n][j] < mn) {
  116. mn = dp[n][j];
  117. v = j;
  118. }
  119. }
  120.  
  121. vi ans;
  122.  
  123. for (i=n; i>; --i) {
  124. k = path[i][v];
  125. ans.pb(k);
  126. v ^= mask[k];
  127. }
  128.  
  129. for (i=n-; i>=; --i)
  130. printf("%d ", ans[i]);
  131. putchar('\n');
  132.  
  133. #ifndef ONLINE_JUDGE
  134. printf("time = %d.\n", (int)clock());
  135. #endif
  136.  
  137. return ;
  138. }

【CF】259 Div.1 B Little Pony and Harmony Chest的更多相关文章

  1. Codeforces Round #259 (Div. 2)-D. Little Pony and Harmony Chest

    题目范围给的很小,所以有状压的方向. 我们是构造出一个数列,且数列中每两个数的最大公约数为1; 给的A[I]<=30,这是一个突破点. 可以发现B[I]中的数不会很大,要不然就不满足,所以B[I ...

  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 ...

  3. 【CF】121 Div.1 C. Fools and Roads

    题意是给定一棵树.同时,给定如下k个查询: 给出任意两点u,v,对u到v的路径所经过的边进行加计数. k个查询后,分别输出各边的计数之和. 思路利用LCA,对cnt[u]++, cnt[v]++,并对 ...

  4. 【CF】310 Div.1 C. Case of Chocolate

    线段树的简单题目,做一个离散化,O(lgn)可以找到id.RE了一晚上,额,后来找到了原因. /* 555C */ #include <iostream> #include <str ...

  5. 【CF】110 Div.1 B. Suspects

    这题目乍眼一看还以为是2-sat.其实很水的,O(n)就解了.枚举每个人,假设其作为凶手.观察是否满足条件.然后再对满足的数目分类讨论,进行求解. /* 156B */ #include <io ...

  6. 【CF】222 Div.1 B Preparing for the Contest

    这样类似的题目不少,很多都是一堆优化条件求最优解,这个题的策略就是二分+贪心.对时间二分, 对费用采用贪心. /* 377B */ #include <iostream> #include ...

  7. 【CF】207 Div.1 B.Xenia and Hamming

    这题目一看很牛逼,其实非常easy.求求最小公倍数,最大公约数,均摊复杂度其实就是O(n). /* 356B */ #include <iostream> #include <str ...

  8. 【CF】142 Div.1 B. Planes

    SPFA.注意状态转移条件,ans的求解需要在bfs中间求解.因为只要到了地点n,则无需等待其他tourist.还是蛮简单的,注意细节. /* 229B */ #include <iostrea ...

  9. 【CF】196 Div.2 D. Book of Evil

    显然这个图是一课树,看着题目首先联想到LCA(肯定是可以解的).但是看了一下数据大小,应该会TLE.然后,忽然想到一个前面做过的题目,大概是在一定条件下树中某结点旋转成为根后查询最长路径.结果灵感就来 ...

随机推荐

  1. hdoj1325 Is It A Tree?

    Is It A Tree?题目链接 题意: 多组测试数据, 每组数据有多个数对, 表示一条有向边(即第一个数是第二个数的父节点), 以 0,0 为一组测试数据结束标志.当输入-1,-1时测试结束. 从 ...

  2. Js5中基本类型

    分别是: Number,//数值 string,字符串 Boolean,//布尔 null,null类型 undefined//未定义 标准库提供了对 布尔 ,数值,字符串三种的构造函数封装 aler ...

  3. PHP中刷新输出缓冲

    http://www.cnblogs.com/mutuan/archive/2012/03/18/2404957.html PHP中刷新输出缓冲buffer是一个内存地址空间,Linux系统默认大小一 ...

  4. (一)JAVA使用POI操作excel

    1,Poi 简介 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能 PO ...

  5. MyEclipse8.5注册码生成

    步骤: 1.建立一个任意名称的Java project: 2.在该工程中建立一个名为MyEclipseGen的Java文件(MyEclipseGen.java) 3.运行下边代码,会在控制台出现&qu ...

  6. 销毁session

    session运行在服务器是单用户,每个session都有一个唯一的sessionid 用法:session.setAttribute("userName", "张三丰& ...

  7. 九度OJ 1371 最小的K个数 -- 堆排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...

  8. centOS 6.4 vsftpd 安装配置

    参考  http://blog.csdn.net/wocjj/article/details/7418944   配置说明 http://www.cnblogs.com/redhatlinux/arc ...

  9. mysql 主从 Got fatal error 1236 from master when reading data from binary log: 'Could not find first 错误

    本地MySQL环境,是两台MySQL做M-M复制.今天发现错误信息: mysql 5.5.28-log> show slave status\G ************************ ...

  10. Libnids---编写网络应用程序的利器

    一.前言 Libnids是一个用于网络入侵检测开发的专业编程接口,它使用Libpcap进行数据包的捕获.同时,Libnids提供了TCP/IP数据流重组功能,因此省去了应用层自己考虑数据分片.重传等情 ...