转载自:http://blog.csdn.net/queuelovestack/article/details/48625899

题意:

有n个卡槽,放有体积不同的n个空盒子,每次你可以移动一个空盒子到相邻卡槽,但前提是相邻卡槽若已经有空盒子,那么要移动的空盒子体积必须小于已有的空盒子,问要移动多少步才能使得从左到右,每个卡槽空盒子的体积递增。
现用①表示1号卡槽,②表示2号卡槽,依次类推……

思路:

状态压缩,状态表示每个盘子所在的位置,每个盘子的位置用三位二进制表示,总共的状态为2^21,因为每次盘子只能向左放或者向右放,那么我们从结束的位置开始搜索,bfs预处理出目标状态到所有状态所需要的最小步数,然后对于每个询问O(1)回答即可。

代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<ctime>
#define eps 1e-6
#define LL long long
#define pii pair<int, int>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;const int MAXN = 5000000;
int n;
int a[10], b[10];
int vis[MAXN];
bool fuck[10];
void bfs(int n) {  queue<int> q;int tmp = 0;for(int i = 0; i < n; i++) {tmp += (i+1) * (1 << (3*i));}q.push(tmp);vis[tmp] = 0;while(!q.empty()) {int s = q.front(); q.pop();memset(fuck, 0, sizeof(fuck));for(int i = 0; i < n; i++) { //i+1在哪个位置 int pos =  (s >> (3*i)) % 8;if(fuck[pos]) continue;fuck[pos] = 1;if(pos>1 && !fuck[pos-1]) {int t = s - (1<<(3*i));if(vis[t]==-1) {q.push(t);vis[t] = vis[s] + 1;} }if(pos<n && !fuck[pos+1]) {int t = s + (1<<(3*i));if(vis[t]==-1) {q.push(t);vis[t] = vis[s] + 1;}}}}
}
int main() {//freopen("input.txt", "r", stdin);int T; cin >> T;memset(vis, -1, sizeof(vis));for(int i = 1; i <= 7; i++) bfs(i);while(T--) {scanf("%d", &n);for(int i = 1; i <= n; i++) scanf("%d", &a[i]), b[i] = a[i];sort(b+1, b+n+1);for(int i = 1; i <= n; i++) a[i] = lower_bound(b+1, b+n+1, a[i]) - b - 1;int s = 0;for(int i = 1; i <= n; i++) {s += i*(1<<(3*a[i]));}printf("%d\n", vis[s]);}return 0;
}

hihoCoder1233(2015北京网络赛H题)相关推荐

  1. 2015北京网络赛 G题 Boxes bfs

    Boxes Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc2015beijingonl ...

  2. hihoCoder1228(2015北京网络赛B题)

    题意: 给出一个文本编辑器的容量,给出老板输入的字符串,小写字母代表文本,大写字母代表命令: L:光标左移: R:光标右移: S:在insert模式和另一个输入模式中切换: D:删除光标后面的一个字符 ...

  3. hdu5491(2015合肥网络赛H题)

    题意: 给出三个数字D.s1和s2,用L来表示D的二进制表示中1的个数,L在区间[s1,s2]中,我们要找到离D最近的并且大于D的一个数字,且这个数字的L也落在区间[s1,s2]中. 思路: 一直超时 ...

  4. hdu5444(2015长春网络赛H题)

    题意: 给出一棵树的描述,这棵树构造出来,满足从右到左数值递增,根在最下面,然后有一些询问x,我们要输出从根走到x的路径,w:向左.e:向右. 思路: 建树的时候,首先第一个点一定是根,然后比根小的建 ...

  5. hihoCoder 1227 2015 北京网络赛 A题

    题意: 给定m个点,然后从这m个点里找到一个点作为圆心,求一个最小的半径使得圆内刚好有n个点,没有压线的点. 思路: 预处理一下各点间的距离,暴力枚举圆心,然后找到排序后的第n个判断即可.坑点:n&g ...

  6. HDU - 5875 2016 ACM/ICPC 大连网络赛 H题 暴力

    题目链接 题意:给你一个区间l,r一直将val[l]模上val[l+1],val[l+2]...val[r],因为一个模上比前一个数小数是没有意义的,所以需要将每一个点找到右边第一个小于他的点就行. ...

  7. hdu5489(2015合肥网络赛F题)

    转载自:http://blog.csdn.net/lwt36/article/details/48774103 题意: 给出一个数列,在其中删除连续的L个数字,使得剩余的数字LIS最大,输出此LIS. ...

  8. hdu5492(2015合肥网络赛I题)

    题意: n*m的格子,每个格子有权值,我们要从左上角走到右下角,只能向下走或者向右走,求走到终点走过的格子的方差的最小值. 思路: 被这题坑了,我还是太蠢. 我们可以暴力(∑Ai)^2,取最优就好了. ...

  9. hdu5455(2015沈阳网络赛F题)

    题意: 给出一个串,问用题中定义的那些串来组成这个串最少要用多少个. 思路: 没啥说的,注意一下输入的串中可能出现除了c和f的字母. 代码: #include<cstdio> #inclu ...

最新文章

  1. 在bootstrap ace样式框架上修改的后台管理型模板(Tab页后台管理模板)
  2. Qt 模型视图编程的简单实例
  3. sqlplus配置连接mysql_如何配置和使用iSQL*Plus
  4. 密码学系列之:feistel cipher
  5. centos 6.7 mysql rpm_CentOS 6.7 下RPM方式安装MySQL 5.6
  6. 使用PerfView监测.NET程序性能(三):分组
  7. LeetCode之Remove Duplicates from Sorted Array
  8. python中赋值运算符有哪些_Python代码中有哪些赋值运算符呢?
  9. linux mv时间,简介Linux中cp和mv搭配{,}在shel_l当中的用法
  10. PTA 程序设计天梯赛(61~80题)
  11. 太硬核了,50年前的登月程序和程序员绝对超乎你的想象
  12. python学习日记(OOP——静态方法和类方法)
  13. Python入门(每日学习打卡7.12)
  14. 计算机老师新年贺卡祝福语,新年贺卡祝福语老师大全
  15. twitter账户受限_如何为您的企业设置Twitter帐户
  16. 2022-2028年中国危化品运输行业市场深度分析及投资规模预测报告
  17. 五、产业互联网价值——构建“双螺旋”产业结构,实现产业价值指数增长
  18. CNN数据集——自己建立数据集要点
  19. css 2713,CSS3 梅花花瓣
  20. 在进行USB CDC类开发时,无法发送64整数倍的数据(续)

热门文章

  1. USTC English Club Note20171016(2)
  2. 科大星云诗社动态20210520
  3. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170410
  4. ethernet调试工具_开发者分享 | 如何调试10G/25G以太网IP自协商/Link Training
  5. 关于同源策略的一些想法
  6. grub4dos初级教程-入门篇
  7. matplotlib 多子图的画法 - 设置坐标范围 - 设置坐标的显示间隔 - 设置figure的大标题 - 设置x轴和y轴的名称 - df.groupby
  8. Plugin with id ‘com.android.XXX‘ not found.
  9. window.open 弹出居中窗口
  10. linux memalign、valloc函数