题目

思路

  • 这道题竟然是状压DP,本人以为是数论,看都没看就去打下一题的暴力了,哭

    \(A_i\)<=30,所以我们只需要考虑1~58个数,再往后选的话还不如选1更优,注意,1是可以重复选取的,因为题目中有一句话



    所以我们所枚举的因子只能包括1~58之间的质因子,而且每个质因子只能选一次,所以选完质因子之后,如果还有剩余的数,就用1填补,而1~58之间的质因子只有16个!!!我们对其进行状压。
  • f[i][j]代表处理到第i位j状态下的最优解
  • 预处理1~58之间的每一个数的因子,用state数组存放,方便处理,

    \(f[0][0]=0\),显然在一个数都不处理的情况下,所得价值为0;
  • dp过程和一般状压dp过程差不多,

    i枚举处理到的位数(min(16,n))-->16个质因子都选完不重复,最大为16

    S枚举前状态

    k枚举要选入的数

    判断合法性,!(S&state[k])为合法,显然,如果前一状态已经包含了k的质因子,不合法,

    然后进行转移--->
    f[i][S|state[k]]=min(f[i][S|state[k]],f[i-1][S]+abs(k-a[i]));

    对当前状态和上一状态加上当前数的贡献取最小值

  • 求转移到的状态(min(16,n))的最小值,可能转移完,也可能没有,如果转移完,直接输出就ok了,如果没有,剩下的用1填补,这就涉及到一开始数组排序方式的问题,如果从小到大,最后没有解决的几个值贡献会很大,所以应该从大到小,先解决大块头

    附上蒟蒻代码


#include<bits/stdc++.h>
using namespace std;
const int maxn=1<<20+1;
int prime[] = {0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
int f[18][maxn];
int n,a[105];
int state[maxn];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
reverse(a+1,a+1+n);
for(int i=1;i<=58;i++){
for(int j=1;j<=16;j++){
if(i<prime[j])break;
else if(i%prime[j]==0){
state[i]|=(1<<(j-1));
}
}
}
int lim=1<<16;
int ans=0x7f7f7f7f;
memset(f,0x3f,sizeof(f));
f[0][0]=0;
for(int i=1;i<=min(16,n);i++){
for(int S=0;S<lim;S++){
for(int k=1;k<=58;k++){
if(!(S&state[k])){
f[i][S|state[k]]=min(f[i][S|state[k]],f[i-1][S]+abs(k-a[i]));
}
}
}
}
for(int S=0;S<lim;S++){
ans=min(ans,f[min(16,n)][S]);
}
if(n>16){
for(int i=17;i<=n;i++)
ans+=abs(a[i]-1);
}
printf("%d\n",ans);
}

推荐状压DP题单(个人觉得比较好的题目,大佬手下留情)

和本题有关:[NOI2015]寿司晚宴

其他:

P1433 吃奶酪

[USACO06NOV]Corn Fields G

[SCOI2005]互不侵犯

[AHOI2009]中国象棋

[SDOI2009]学校食堂

[SDOI2009]Bill的挑战

[NOI2001]炮兵阵地

P2831 愤怒的小鸟

P2915 [USACO08NOV]Mixed Up Cows G

P3052 [USACO12MAR]Cows in a Skyscraper G

P3226 [HNOI2012]集合选数

P4163 [SCOI2007]排列

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

  1. LGTB与序列 状压dp

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

  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. 利用tcpdump命令统计http的GET和POST请求

    1.搭建的知识库服务器, 需要统计来访者都是哪些人,因为系统不是自己开发的,看不到访问日志.所以考虑从系统层面抓取访问流量来实现. 2.通过tcpdump抓取的数据包,在wireshark中打开发现, ...

  2. (数据科学学习手札86)全平台支持的pandas运算加速神器

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 随着其功能的不断优化与扩充,pandas已然成为 ...

  3. 除了FastJson,你也应该了解一下Jackson(一)

    在上月末的时候收到一条关于fastjson安全漏洞的消息,突然想到先前好像已经有好多次这样的事件了(在fastjson上面).关于安全方面,虽然中枪的机率微小,但是在这个信息越来越复杂的时代,安全性也 ...

  4. python—socket编程

    一:客户端/服务器 架构 1.硬件C/S架构:(例如,打印机) 2.软件C/S架构:互联网中处处是C/S架构 腾讯作为服务端为你提供视频,你得下个腾讯视频客户端才能看它的视频 C/S架构与socket ...

  5. 数据结构与算法-python描述-双向链表

    # coding:utf-8 # 双向链表的相关操作: # is_empty() 链表是否为空 # length() 链表长度 # travel() 遍历链表 # add(item) 链表头部添加 # ...

  6. 使用WPF实现的 喜马拉雅FM 资源下载工具

    因为喜马拉雅pc网站上没有提供下载功能,之前有个同事问我有没有办法将资源下载到本地,当然通过浏览器F12也能找到下载地址,但挺麻烦.正好最近想学wpf,周末在家也没事,于是对着百度撸了下代码.当然只能 ...

  7. ubuntu12.04 dnw2 fl2440 配置

    1.安装libusb-dev sudo apt-get install libusb-dev 2.dnw2编译配置 源码如下,将其保存为dnw2.c 编译命令 gcc dnw2.c -o dnw2 - ...

  8. css固定宽高DIV内部元素垂直居中的方法

    应用案例 案例是这样的,一个外层div,高宽是固定的,但是里面内容不是固定的.很多朋友的做法是头部加一个padding或者margin,这样,里面内容显得貌似是居中了,但是假如内容变化,这样头部的固定 ...

  9. Java学习之IO流及网络编程

    一.字节 1.1字节输入流(java.io.InputStream) ​ 此抽象类是表示字节输入流的所有类的超类 1.1.1定义了所有子类共性的方法: ​ int read() 从输入流中读取数据的下 ...

  10. Dart Memo for Android Developers

    Dart Memo for Android Developers Dart语言一些语法特点和编程规范. 本文适合: 日常使用Kotlin, 突然想写个Flutter程序的Android程序员. Dar ...