我们首先可以得到:如果有一堆盘子里有一些相邻的盘子的直径相等,那么自然这些盘子可以统一处理,就可以缩成一个了。

然后我们接着考虑给每一堆盘子都染上一种颜色,那么操作的次数 step = diff * 2 - n + 1

其中 diff 表示最终的盘子堆中相邻的盘子的颜色不同的对数。

接着我们可以将盘子的直径离散化。

那么我们可以考虑Dp,设 Dp[s][i] 为处理完所有盘子直径小于等于 s 的盘子,并且最底下的盘子的颜色是 i 的 diff 的最小值。

至于转移的话呢,记直径为 s 的盘子个数为 tot[s],然后找到所有直径为 s 的盘子及其颜色 i ,那么就有:

  • res1 = min(Dp[s - 1][j] + tot[s]) (j = 1 ~ n)
  • res2 = min(Dp[s - 1][k] + tot[s] - 1) (存在一个直径为 s,颜色为 k 的盘子)
  • Dp[s][i] = min(res1, res2)

初始化 Dp[0][i] = 0 (i = 1 ~ n)

答案 ans = min(Dp[Max_s][i]) * 2 - n + 1

于是就做完啦~

毕竟 Gromah 太弱,只会做水题。

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 50 + 5
#define M 2500 + 5
#define SIZE 10000 + 5
#define INF 593119681 int _, n;
int A[N][N];
int Size[N], Point[N], T[N];
int Dp[][N];
int S[SIZE]; inline void Init()
{
memset(S, , sizeof(S));
for (int i = ; i <= n; i ++)
{
scanf("%d", Size + i);
for (int j = ; j <= Size[i]; j ++)
{
scanf("%d", A[i] + j);
S[A[i][j]] = ;
}
Size[i] = unique(A[i] + , A[i] + Size[i] + ) - A[i] - ;
Point[i] = ;
}
for (int i = ; i < SIZE; i ++)
S[i] += S[i - ];
for (int i = ; i <= n; i ++)
for (int j = ; j <= Size[i]; j ++)
A[i][j] = S[A[i][j]];
} inline void Solve()
{
printf("Case %d: ", ++ _);
for (int i = ; i <= n; i ++)
Dp[][i] = ;
for (int i = ; i <= S[SIZE - ]; i ++)
{
T[] = ;
Dp[][] = INF;
for (int j = ; j <= n; j ++)
{
if (A[j][Point[j]] == i)
T[++ T[]] = j, Point[j] ++;
Dp[][j] = INF;
}
for (int j = ; j <= T[]; j ++)
{
for (int k = ; k <= T[]; k ++)
{
if (j == k && T[] > ) continue ;
Dp[][T[k]] = min(Dp[][T[k]], Dp[][T[j]] + T[] - );
}
for (int k = ; k <= n; k ++)
Dp[][T[j]] = min(Dp[][T[j]], Dp[][k] + T[]);
}
for (int j = ; j <= n; j ++)
Dp[][j] = Dp[][j];
}
int Min = INF;
for (int i = ; i <= n; i ++)
Min = min(Min, Dp[][i]);
printf("%d\n", Min * - n + );
} int main()
{
#ifndef ONLINE_JUDGE
freopen("3982.in", "r", stdin);
freopen("3982.out", "w", stdout);
#endif while (scanf("%d", &n) == )
{
Init();
Solve();
} #ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return ;
}

BZOJ 3982 Stacking Plates 解题报告的更多相关文章

  1. BZOJ 4619 Swap Space 解题报告

    今天是因为David Lee正好讲这个题的类似题,我才做了一下. 本题是world final 2016的一道水…… 题目地址如下 http://www.lydsy.com/JudgeOnline/p ...

  2. BZOJ 2839: 集合计数 解题报告

    BZOJ 2839: 集合计数 Description 一个有\(N\)个元素的集合有\(2^N\)个不同子集(包含空集),现在要在这\(2^N\)个集合中取出若干集合(至少一个),使得 它们的交集的 ...

  3. BZOJ 1367 [Baltic2004]sequence 解题报告

    BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...

  4. BZOJ 1044 木棍分割 解题报告(二分+DP)

    来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limi ...

  5. BZOJ 4341 [CF253 Printer] 解题报告

    乍一看这个题好像可以二分优先度搞搞... 实际上能不能这么搞呢...? 我反正不会... 于是开始讲我的乱搞算法: 首先肯定要把任务按照优先度排序. 用一棵在线建点的线段树维护一个时刻是否在工作. 然 ...

  6. BZOJ 4036 [HAOI2015] Set 解题报告

    首先我们不能一位一位的考虑,为什么呢? 你想想,你如果一位一位地考虑的话,那么最后就只有 $n$ 个数字,然而他给了你 $2^n$ 个数字,怎么看都不对劲呀.(我是因为这样子弄没过样例才明白的) 所以 ...

  7. BZOJ 3288 Mato矩阵 解题报告

    这个题好神呀..Orz taorunz 有一个结论,这个结论感觉很优美: $$ans = \prod_{i=1}^{n}\varphi(i)$$ 至于为什么呢,大概是这样子的: 对于每个数字 $x$, ...

  8. BZOJ 4123 [Baltic2015] Hacker 解题报告

    首先,Alice 会选择一个长度为 $\lfloor\frac{n+1}{2}\rfloor$ 的区间,我们把这个长度记为 $len$. 有这么一个结论:令 $F_i$ 为覆盖 $i$ 点的所有长度为 ...

  9. BZOJ 4146 [AMPPZ2014] Divisors 解题报告

    这个题感觉比较小清新... 我们记录每个数出现的次数 $T_i$. 首先依次枚举每个数字,令 $ans = ans + T_i \times (T_i - 1)$,然后枚举这个数的倍数,令 $ans ...

随机推荐

  1. canvas实现“探照灯”共能

    简单的样式: body{ margin: 0; padding: 0;}#canvas{ display: block; position: relative; margin: auto;} 创建绘图 ...

  2. PHP 使用get_class_methods()和array_diff() 兩個相同的類中方法差集

    进行二次开发时,习惯一份是原封不动的,一份正在修改.在修改时,发现修改的缺少原项目中的一些方法.本打算一个方法一个方法的对比,可是这样会比较花时间,划不来,PHP可以使用get_class_metho ...

  3. Web前端发展简史

    Web前端发展简史 有人说“前端开发”是IT界最容易被误解的岗位,这不是空穴来风.如果你还认为前端只是从美工那里拿到切图, JS和CSS一番乱炖,难搞的功能就去网上信手拈来,CtrlC + Ctrl ...

  4. MySQL高可用解决方案(MySQL HA Solution)

    http://blog.sina.com.cn/s/blog_7e89c3f501012vtr.html 什么是高可用性?很多公司的服务都是24小时*365天不间断的.比如Call Center.这就 ...

  5. h2database源码浅析:MVTable与MVIndex

    Database包含一个Store:MVTableEngine.Store getMvStore() MVTableEngine.Store可以获取各tables:java.util.HashMap& ...

  6. PL/SQL在Oracle服务器上连接出错

    今天在Oracle服务器上使用PL/SQL连接Oracle软件的时候出现了错误,错误如下: 具体的解决办法如下: 需要下载32位的Oracle Client,具体的步骤如下:登录Oracle官方网站 ...

  7. ping 命令详解

    Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说"ping一下某机器,看是不是开着".不能打开网页时会说"你先ping网关地址 ...

  8. 查看帮助文档的一些方法:help,dir,type,func_global等

    help与dir与type:在使用python来编写代码时,会经常使用python自带函数或模块,一些不常用的函数或是模块的用途不是很清楚,这时候就需要用到help函数来查看帮助.这里要注意下,hel ...

  9. JQuery里的原型prototype分析

    在 JavaScript 中,每个函数对象都有一个默认的属性 prototype,称为函数对象的原型成员,这个属性指向一个对象,称为函数的原型对象,当我们每定义了一个函数的时候,JavaScript ...

  10. [jquery]高级篇--js绑定事件

    参考:  http://www.cnblogs.com/leejersey/p/3545372.html jQuery on()方法是官方推荐的绑定事件的一个方法.$(selector).on(eve ...