考试一看我就想到了状压dp。当时没有想到素数,以为每一位只有0~9这些数,就开始压了。后来发现是小于30,然后改到了15,发现数据一点不给面子,一个小点得数都没有,完美爆零。。

考虑到bi最多变成58,如果变成更大的数还不如变成1,而且58之内只有16个素数,所以就压这16个素数就行了。就是他们的素数因子。

f[i][j]表示到第i位质因数压进去状态为j时最短序列;

f[i][j|prime[k]]=min(f[i][j|prime[k]],f[i-1][j]+abs(a[i]-k));

注意排序一下这些数,找前16个就行,因为最多有16个素数,其他的就都是1了,不要忘了最后加上。

PS:我的代码打表打过去的。借用一下同学的。

#include
#include
#include
#include
#include
#include
using namespace std;
int n,ji=0,jishu,shu=0x7fffffff;
int a[150],b[150],prime[100],f[110][1<<16],zhi[70];
bool su[5050];
int pai(const int a,const int b)
{
  return a>b;
}
int xiao(int x,int y)
{
  if(x<=y)  return x;
  else  return y;
}
int lowbit(int x)
{
  return x&-x;
}
int zhao(int x)
{
  int shu=0;
  while(x>0)
  {
    if(x&1)
      return shu;
    x>>=1;
    shu++;
  }
  return shu;
}
int count(int x)
{
  int shu=0;
  while(x>0)
  {
    if(x&1)
      shu++;
    x>>=1;
  }
  return shu;
}
int main()
{
  //freopen("seq.in","r",stdin);
  //freopen("seq.out","w",stdout);
  memset(su,0,sizeof(su));
  memset(f,0x3f,sizeof(f));
  memset(prime,0,sizeof(prime));
  memset(zhi,0,sizeof(zhi));
  cin>>n;
  for(int i=1;i<=n;++i)
    cin>>a[i];
  f[0][0]=0;
  sort(a+1,a+n+1,pai);
  su[1]=1;
  for(int i=2;i<=10;++i)
    for(int j=2;j<=50;++j)
      su[i*j]=1;
  for(int i=2;i<=58;++i)
    if(su[i]==0)
      prime[i]=++ji;
  for(int i=2;i<=61;++i)
    for(int j=2;j<=i;++j)
    {
      if(i%j==0&&prime[j]!=0)
        zhi[i]|=(1<<(prime[j]-1));
    }
  for(int i=0;i
    for(int j=0;j<(1<<16);++j)
      for(int k=1;k<=60;++k)
      {
        if((j&zhi[k])==0)
          f[i+1][j|zhi[k]]=xiao(f[i+1][j|zhi[k]],f[i][j]+abs(a[i+1]-k));
      }
    for(int i=0;i<(1<<16);++i)
      if(f[xiao(n,16)][i]
        shu=f[xiao(n,16)][i];
  if(n<=16)
    cout<<shu;
  else
  {
    for(int i=17;i<=n;++i)
      shu+=abs(a[i]-1);
    cout<<shu;
  }
  //system("pause");
  return 0;
}

  

LGTB与序列 状压dp的更多相关文章

  1. 状压DP之LGTB 与序列

    题目 思路 这道题竟然是状压DP,本人以为是数论,看都没看就去打下一题的暴力了,哭 \(A_i\)<=30,所以我们只需要考虑1-58个数,再往后选的话还不如选1更优,注意,1是可以重复选取的, ...

  2. 2018.10.05 NOIP模拟 上升序列(状压dp)

    传送门 状压dp好题. 首先需要回忆O(nlogn)O(nlog n)O(nlogn)求lislislis的方法,我们会维护一个单调递增的ddd数组. 可以设计状态f(s1,s2)f(s1,s2)f( ...

  3. ZOJ3802 Easy 2048 Again (状压DP)

    ZOJ Monthly, August 2014 E题 ZOJ月赛 2014年8月 E题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...

  4. fzu2188 状压dp

    G - Simple String Problem Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  5. zoj3802:easy 2048 again(状压dp)

    zoj月赛的题目,非常不错的一个状压dp.. 题目大意是一个一维的2048游戏 只要有相邻的相同就会合并,合并之后会有奖励分数,总共n个,每个都可以取或者不取 问最终得到的最大值 数据范围n<= ...

  6. [poj1185]炮兵阵地_状压dp

    炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...

  7. [HNOI2012]集合选数(状压DP+构造)

    题目要求若出现x,则不能出现2x,3x 所以我们考虑构造一个矩阵 \(1\ 2\ 4 \ 8--\) \(3\ 6\ 12\ 24--\) \(9\ 18\ 36--\) \(--\) 不难发现,对于 ...

  8. our happy ending(状压dp)

    题意:给定一个n,k,l. 问有多少长度为n的序列满足选出一些数使得他们相加为k,数列中每个数都在1-l以内. Solution 正解还是很妙的. 状压dp,设dp[i][j]表示长度为i的序列,能表 ...

  9. NowCoder110E Pocky游戏 状压DP

    传送门 题意:给出$N$个数和一个长为$M$.所有数在$[1,N]$范围之内的正整数序列$a_i$,求出这$N$个数的一种排列$p_1...p_N$使得$\sum\limits_{i=2}^M |p_ ...

随机推荐

  1. 一个DOM元素同时拥有多个类名时的样式产生冲突时 属性取决于css样式表中后读取到的属性

    如果一个DOM元素包含多个类名,其中的两个类名的属性产生冲突,并不是根据htnl中类名的顺序来决定DOM元素的属性, 而是根据css样式中的顺序来决定DOM元素的属性,它取决于css样式表中后读取到的 ...

  2. 搭建nexus私服(maven)

    这里提供nexus的直接下载页面的链接: https://www.sonatype.com/download-oss-sonatype maven获取依赖jar包是从中央仓库获取,但很莫名的出现jar ...

  3. Java虚拟机面试重点-------------内存分配和回收策略

    1 对象优先分配在Eden区 对象优先在Eden进行分配,大多数情况下,对象在新生代Eden区进行分配.当Eden区没有足够的空间进行分配时,虚拟机会发起一次Minor GC. 新生代GC(Ninor ...

  4. React环境配置

    现在开始配置一个基础项目. 创建项目文件夹:C:\Users\Danny\Desktop\React npm init 创建package.json文件 下面的所有安装,都是--save-dev,因为 ...

  5. 使用C#创建简单的WCF服务

    一.开发环境 操作系统:Windows 10 开发环境:VS2015 编程语言:C# IIS版本:10.0.0.0 二.添加WCF服务.Internet Information Services(II ...

  6. [问题解决]linux sudo xxx:command not found

    题外话 软件的安装在linux下主要分为两种.一种是通过包管理器例如ubuntu的apt-get xxx,另一种是自己手动安装.通过包管理器安装的,基本开箱即用,无需配置,但是存在一个问题,有时候无法 ...

  7. IE浏览器兼容问题(上)——html和css的兼容写法

    用户使用的浏览器五花八门,我们要保证每一种浏览器都能兼容我们的代码,不能要求用户去改变浏览器,那么就得在我们的代码上下功夫.此时我们要用到hack. HACK就是针对不同的浏览器写不同的HTML.CS ...

  8. 编写高质量代码改善C#程序的157个建议:第17个建议之多数情况下使用foreach进行循环遍历

    今天是我看<编写高质量代码:改善C#程序的157个建议>第二遍的时候了,看完这本书的确是受益匪浅,学到了很多东西,也明白了很多道理. 里面的代码我每个都调试了一遍,有时候是有些出入的,可能 ...

  9. 计算总和及平均值u

    代码如下: package ClassDemo; import java.util.Scanner; public class ScannerTest { public static void mai ...

  10. hdu_1907:John(Nim变形)

    题目链接 仍是取石子,不过取到最后一个的败 参考链接:http://www.voidcn.com/blog/liwen_7/article/p-3341825.html 简单一句话就是T2 S0必败 ...