考试一看我就想到了状压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. 使用Scribefire在博客中插入语法高亮

    效果如下, 文字1 int cool void main() { cout<<"hello world!"<<endl } 文字2 经过一番折腾,终于搞定了 ...

  2. phpcmsV9常用标签

    头部: <title>{if isset($SEO['title']) && !empty($SEO['title'])}{$SEO['title']}{/if}{$SEO ...

  3. panic和recover的使用规则

    转自个人博客 chinazt.cc 在上一节中,我们介绍了defer的使用. 这一节中,我们温习一下panic和recover的使用规则. 在golang当中不存在tye ... catch 异常处理 ...

  4. 在ASP.NET Core配置环境变量和启动设置

    在这一部分内容中,我们来讨论ASP.NET Core中的一个新功能:环境变量和启动设置,它将开发过程中的调试和测试变的更加简单.我们只需要简单的修改配置文件,就可以实现开发.预演.生产环境的切换. A ...

  5. accp8.0转换教材第10章Ajax和jQuery理解与练习

    C/S (Client/Server)结构,即大家熟知的客户机和服务器结构. B/S(Browser/Server)结构即浏览器和服务器结构. 认识ajax .XMLHttpRequest.使用jqu ...

  6. ReactNative开发工具有这一篇足矣

    ReactNative系列文章: 1.<逻辑性最强的React Native环境搭建与调试> 2.<ReactNative开发工具有这一篇足矣> 正文 React Native ...

  7. (转载)在spring的bean中注入内部类

    原文链接:http://outofmemory.cn/java/spring/spring-DI-inner-class 在spring中注入内部类,有可能会遇到如下异常信息: 2014-5-14 2 ...

  8. Python学习笔记——import模块

    OS模块 直接输出系统命令到屏幕,该方法获取的命令返回值不可被赋值给变量,输出结果受编码影响会乱码: import os os.system("ipconfig") 将执行获取的系 ...

  9. Merge使用

    Role r = new Role(); r.setName("TEST"); r.setDescription("123"); r.setLevel(2); ...

  10. docker~linux下的部署和基本命令

    回到目录 docker是最近比较流行的容器工具,它可以帮助我们快速部署应用,尤其是在“微服务”环境下,成百个服务要去启动,停止,部署一次太麻烦,而如果把它部署到docker里,下一次应用就方便多了,如 ...