Codeforces Round #259 (Div. 2)-D. Little Pony and Harmony Chest

题目范围给的很小,所以有状压的方向。

我们是构造出一个数列,且数列中每两个数的最大公约数为1;

给的A[I]<=30,这是一个突破点。

可以发现B[I]中的数不会很大,要不然就不满足,所以B[I]<=60左右。构造DP方程DP[I][J]=MIN(DP[I][J],DP[I][J^C[K]]+abs(a[i]-k));

K为我们假设把这个数填进数组中的数。同时开相同空间记录位置,方便输出结果。。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int cnt=0;
int c[123],a[123];
int dp[101][(1<<16)+5];
int pre[101][(1<<16)+5][2];
int b[123]={0};
int p[123];

void prime()//帅选素数
{
   for (int i=2;i<60;i++)
   if (!b[i])
   {
       p[++cnt]=i;
       for (int j=i+i;j<60;j+=i)
       b[j]=1;
       }
}

int cal(int x)//对每个数分解素数
{
  int ans=0;
  for (int i=1;i<=cnt;i++)
  {
      if (x%p[i]==0) ans|=(1<<(i-1));
      while (x%p[i]==0) x/=p[i];
  }
  return ans;
}

void print(int x,int pos)//递归出数组
{
        if (x==0) return;
        print(x-1,pre[x][pos][0]);
        cout<<pre[x][pos][1]<<" ";
}

int main()
{
    int n;
    prime();
    cin>>n;
    for (int i=1;i<=n;i++) cin>>a[i];
    for (int i=1;i<60;i++)
         c[i]=cal(i);
    memset(dp,inf,sizeof(dp));
    memset(dp[0],0,sizeof(dp[0]));//初始化

    for (int i=1;i<=n;i++)
      for (int j=0;j<(1<<16);j++)
         for (int k=1;k<60;k++)
          if ((j&c[k])==c[k]){//由前一个状态推后一个状态
             int tmp=dp[i-1][j^c[k]]+abs(k-a[i]);
               if (dp[i][j]>tmp)
                {
                 dp[i][j]=tmp;
                 pre[i][j][0]=(j^c[k]);
                 pre[i][j][1]=k;
                }
        }

        int min=inf,pos;
        for (int i=0;i<(1<<16);i++)
        if (dp[n][i]<min)
        {
        min=dp[n][i];
        pos=i;
        }
    print(n,pos);
return 0;
}

Codeforces Round #259 (Div. 2)-D. Little Pony and Harmony Chest,布布扣,bubuko.com

时间: 2024-10-22 13:24:16

Codeforces Round #259 (Div. 2)-D. Little Pony and Harmony Chest的相关文章

Codeforces Round #259 (Div. 2) D. Little Pony and Harmony Chest 状压DP

D. Little Pony and Harmony Chest Princess Twilight went to Celestia and Luna's old castle to research the chest from the Elements of Harmony. A sequence of positive integers bi is harmony if and only if for every two elements of the sequence their gr

Codeforces Round #259 (Div. 2) B. Little Pony and Sort by Shift(模拟)

题目链接:Codeforces Round #259 (Div. 2)  B. Little Pony and Sort by Shift 求给出的序列最少移动多少次成为非下降序列.移动方式:只能将最后一个元素移到第一个位置 即:a1,?a2,?...,?an?→?an,?a1,?a2,?...,?an?-?1. 从后前开始搜非下降的子序列,然后前面的子序列接在其后面,最后判断变化后的序列是否是非下降序列即可. AC代码: #include<stdio.h> #include<strin

Codeforces Round #259 (Div. 2) C - Little Pony and Expected Maximum (数学期望)

题目链接 题意 : 一个m面的骰子,掷n次,问得到最大值的期望. 思路 : 数学期望,离散时的公式是E(X) = X1*p(X1) + X2*p(X2) + …… + Xn*p(Xn) p(xi)的是所有最大值是xi的情况数/总情况数一共是m^n种,掷n次,所有最大值是xi的情况数应该是xi^n,但是这里边却包含着最大值非xi且不超过xi的种数,所以再减去最大值是xi-1或者最大值不超过这个的情况数.即sum += xi * (xi^n-(xi-1)^n)/m^n,但是这样求肯定是不行,因为m

Codeforces Round #259 (Div. 2) C - Little Pony and Expected Maximum

题目链接 题意: 分析: 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <cstdio> 6 #include <vector> 7 #include <algorithm> 8 #define LL long long 9 using namespace std; 10 11 in

【CF】259 Div.1 B Little Pony and Harmony Chest

还蛮有趣的一道状态DP的题目. 1 /* 435B */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9 #include <deque> 10 #include <algorithm

Codeforces Round #259 (Div. 1)——Little Pony and Expected Maximum

题目连接 题意: 输入n.m,表示一个n面的色子(面上的值为1-n),投掷m次,求得到的最大值的期望(1?≤?m,?n?≤?105). 分析: 假设当前得到的最大值是Max,那么对应的概率是:sigma(C(m,k) * ((1 / n) ^ k )*(((Max - 1) / n) ^ (m - k)) ),(1 <= k <= n):化简就可以得到:sigma(C(m,k) * ((1 / n) ^ k )*(((Max - 1) / n) ^ (m - k)) ) - ((Max - 1

Codeforces Round #259 (Div. 1)——Little Pony and Harmony Chest

题目连接 题意: 给n个整数ai,求一个序列bi,使得b序列中任意两个数互质,而且sigma(abs(ai - bi))最小,输出任意一个b序列即可 (1?≤?n?≤?100)  (1?≤?ai?≤?30) 分析: 首先明确一点,题目没有限制b的范围....为此wa了好多次,不过可以推断出来,b肯定小于等于60 任意两个数互质,也就是说,对于新加入的一个bi,如果知道了之前所有数的质因子,那么当前数只要没有这个质因子就是一种满足的情况.而60以内的质数不到20个,所以直接状压DP即可.DP[i]

Codeforces Round #259 (Div. 2) (简单模拟实现题)

题目链接:http://codeforces.com/problemset/problem/454/A A. Little Pony and Crystal Mine time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Twilight Sparkle once got a crystal from the Crystal Mine

Codeforces Round #259 (Div. 2) (序列)

题目链接:http://codeforces.com/contest/454/problem/B B. Little Pony and Sort by Shift time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output One day, Twilight Sparkle is interested in how to sort a se