题目

思路

  • 这道题竟然是状压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. OC语言-NSMutableArray为什么要用strong来修饰

    Talk is cheap show you my code!  NSMutableArray属性为什么要用strong来修饰,其实就是一个深复制和浅复制的问题. <pre name=" ...

  2. SmokePing 快速搭建

    SmokePing介绍 smokeping是来监控IDC机房网络质量情况,可以从监控图上的延时与丢包情况分辨出机房的网络是否稳定,是否为多线,是否为BGP机房以及到各城市的三个运行商网络各是什么情况. ...

  3. 关于Graph Convolutional Network的初步理解

    为给之后关于图卷积网络的科研做知识积累,这里写一篇关于GCN基本理解的博客.GCN的本质是一个图网络中,特征信息的交互+与传播.这里的图指的不是图片,而是数据结构中的图,图卷积网络的应用非常广泛 ,经 ...

  4. LiveCharts 提示框(DataTooltip)百分比一直为0.00%解决办法

    LiveCharts 提示框(DataTooltip)百分比一直为0.00%解决办法 问题描述:在使用LiveCharts 开源图标库的时候,使用CartesianChart类图表,当Series为L ...

  5. 构造函数,拷贝构造和赋值运算符调用时机,explicit,

    #include<iostream> #include <stdio.h> using namespace std; class test{ int mvalue; publi ...

  6. ASP.NET Core Blazor WebAssembly 之 .NET JavaScript互调

    Blazor WebAssembly可以在浏览器上跑C#代码,但是很多时候显然还是需要跟JavaScript打交道.比如操作dom,当然跟angular.vue一样不提倡直接操作dom:比如浏览器的后 ...

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

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

  8. (四)MySQL条件查询(通配符、模糊查询)、排序查询、分组查询(单行、分组函数)

    一.条件查询 1.含义:前面学的基础查询可以查询一个或多个字段,如果需要的数据仅仅是其中的某一行或多行就用到了条件查询. 2.语法:(序号表示语句执行顺序) SELECT 字段名 ③ FROM 表名 ...

  9. 一行代码让你的python运行速度提高100倍

    转自:https://www.cnblogs.com/xihuineng/p/10630116.html 加上之后运行速度快了十倍,我的天呐. python一直被病垢运行速度太慢,但是实际上pytho ...

  10. 如何 SSH 到 Linux 服务器里的特定目录及执行命令?

    你是不是有遇到过这样的场景?使用 SSH 命令进入到服务器,然后再用 cd 命令进入到对应目录,再继续进行你的工作. 这种操作对于新手来讲特别常见,良许之前也是这样.在本文,老司机将带你来进行更高效的 ...