博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 453B B. Little Pony and Harmony Chest(dp+数论)
阅读量:3711 次
发布时间:2019-05-21

本文共 1460 字,大约阅读时间需要 4 分钟。

题目链接:


题目大意:

给出一个序列a,求取一个序列b,b序列的数两两互质,问能够导致 |aibi| 最小的方案


题目分析:

  • 定义状态dp[i][j]表示前i个数达到j状态的最小的结果,j状态表示已经被用过的质数。
  • 因为当一个a的数据范围不超过30,所以如果某个数超过60,那么选择1一定比它更优,所以我们能够用到的数的质因子也一定不会超过60,也才17个,所以我们只需要每次枚举数,然后通过之前的状态进行转移即可。
  • 具体转移过程见代码。
  • 为了得到方案,我们记录了pre[i][j]代表前i个数达到状态j得到最大值的前一个状态,num[i][j]表示前i个数达到状态j得到最大值的最后选取的数字。

AC代码:

#include 
#include
#include
#include
#include
#define MAX 107using namespace std;int n,a[MAX];int dp[107][1<<17];int pre[107][1<<17];int num[107][1<<17];int prime[]={
2,3,5,7,11,13,17,19,23,29,31,37,39,41,43,47,53};int state[60];void print ( int i ,int u ){ if ( i == 1 ) { printf ( "%d " , num[i][u] ); return; } print ( i-1 , pre[i][u] ); printf ( "%d " , num[i][u] );}int main ( ){ while ( ~scanf ( "%d" , &n ) ) { for ( int i = 1 ; i <= n ; i++ ) scanf ( "%d" , &a[i] ); memset ( dp , 0x3f , sizeof ( dp ) ); int INF = dp[0][0]; dp[0][0] = 0; memset ( state , 0 , sizeof ( state ) ); for ( int i = 2 ; i < 60 ; i ++ ) for ( int j = 0; j < 17 ; j++ ) if ( i%prime[j] == 0 ) state[i] |= (1<
dp[i][j] + abs ( a[i+1] - k ) ) { dp[i+1][x] = dp[i][j] + abs ( a[i+1] - k ); pre[i+1][x] = j; num[i+1][x] = k; } } } int ans = INF,loc = -1; for ( int i = 0 ; i < total ; i++ ) if ( ans > dp[n][i] ) { ans = dp[n][i]; loc = i; } print ( n , loc ); puts (""); }}

转载地址:http://mqvjn.baihongyu.com/

你可能感兴趣的文章
Day47 Java框架 Struts框架(二)
查看>>
Day54 Java框架 SSH案例_CRM(二)
查看>>
Day55 Java框架 SSH案例_CRM(三)
查看>>
Day56 Java框架 SSH案例_CRM(四)
查看>>
Day58 Java框架 SSH案例_CRM(六) Easyui&列表展示
查看>>
Day63 Maven(一)Maven安装.
查看>>
Day64 Maven(二)Maven整合SSH
查看>>
C/C++课程设计 之货物管理系统
查看>>
IDEA连接mysql报"Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' "的错误
查看>>
C语言小游戏之推箱子
查看>>
Java GUI 实现登录注册界面
查看>>
C语言 实现登录注册功能
查看>>
C/C++课程设计 之职工管理系统
查看>>
C/C++编程题 输入学号,输出学号的后三位,并输出并求出0到后三位之前数的和
查看>>
C++ 知识要点
查看>>
C/C++课程设计 新生入学管理系统(二)
查看>>
Java 获取本地IP地址
查看>>
Java练习题(一) 自定义多个字符和数字,求出6位随机数的组合
查看>>
Java练习题(二)求出一个文件的目录名以及目录总个数
查看>>
Java类名.方法和变量
查看>>