hihocoder #1170 机器人 && 编程之美2015复赛
来源:互联网 发布:青岛专业seo服务公司 编辑:程序博客网 时间:2024/04/30 06:05
题意:
描述
小冰的N个机器人兄弟排成一列,每个机器人有一个颜色。现在小冰想让同一颜色的机器人聚在一起,即任意两个同颜色的机器人之间没有其他颜色的的机器人。
假设任意相邻的两个机器人可以交换位置,请问最少需要多少次交换?
输入
第一行为一个整数T,为数据组数,之后每组数据两行。
第一行为N和K,表示机器人的个数与颜色的总数。
接下来一行N个数,第i个数表示第i个机器人的颜色,取值范围为1到K。
输出
对于每组数据输出一行,形如"Case #X: Y"。X为数据组数,从1开始,Y为最少的交换步数。
数据范围
1 ≤ T ≤ 20
1 ≤ N ≤ 105
小数据
1 ≤ K ≤ 3
大数据
1 ≤ K ≤ 16
1.状态压缩dp,dp[11001]表示1,2,5这三种机器人已经达到要求(并且1,2,5排在3,4号机器人的前面)所需要的最
少步数
2.举个例子说明:1,2,3,4,5这五种机器人,当dp[10001]转移到dp[11001],要想让2号达到要求,并且已知1,5号机器人
已经达到要求,就需要让2,3,4号机器人通过交换位置使得,2号机器人排在一起,且处于3,4号机器人的前边
3.达到这个目标,需要知道:逆序数对==通过交换最少的次数达到'有序'
4.预处理i号机器人(范围[1,k])到j号机器人(范围[1,k])所产生的逆序对数pre[i][j]
5.最后达到3的目标,pre[2][3] + pre[2][4]就是将2号机器人换到3,4号机器人前方所需要的步数
总结:
1.开始想用贪心写,写完之后才发现错了
2.看到网上说状态压缩,其实就是暴力,想了好多天依旧没有想出来
3.看到逆序对数==最少交换步数才差不多想出来怎么做的
4.感觉还需要努力,加强全面思考问题的能力
5.最近在学习图像处理,opencv,进度太慢被老师说了,需要提高工作效率!
6.项目这种事情还是要快,快,快,不能像ACM享受慢慢思考并弄懂问题的快乐,也可能与平时效率低下不愿面对自
己的问题有关
7.总之,不同的科目有不同的学习方法,但是不管什么都需要提高效率,并且都要弄懂原理
8.不纠结于细节,快速找到自己需要学习的目标。
#include<iostream>#include<cstring>#include<cstdio>#include<vector>using namespace std;typedef long long LL;#define MAXN 100005#define INF 0x3f3f3f3f3f3f3f3f#define MAXM 16#define MAXP 65536int n,m,pre[MAXM][MAXM];LL dp[MAXP];vector<int>vec[MAXM];int main(){ int _,cur; for(int kcas = scanf("%d",&_);kcas <= _;kcas++) { scanf("%d%d",&n,&m); for(int i = 0;i < m;i++)vec[i].clear(); for(int i = 0;i < n;i++) { scanf("%d",&cur); vec[cur - 1].push_back(i); } memset(pre,0,sizeof(pre)); for(int i = 0;i < m;i++) for(int j = 0;j < m;j++)if(i != j) for(int u = 0,v = 0;u < vec[i].size();u++) { while(v < vec[j].size() && vec[i][u] > vec[j][v]) v++; pre[i][j] += v; } memset(dp,0x3f,sizeof(dp)); dp[0] = 0; int cnt = 1 << m; for(int i = 0;i < cnt;i++) { for(int j = 0;j < m;j++)if(!(i >> j & 1)) { LL num = 0; for(int k = 0;k < m;k++)if(!(i >> k & 1) && k != j) num += pre[j][k]; dp[i | (1 << j)] = min(dp[i | (1 << j)],dp[i] + num); } } printf("Case #%d: %lld\n",kcas,dp[(1 << m) - 1]); }}
- hihocoder #1170 机器人 && 编程之美2015复赛
- 编程之美挑战赛复赛B题
- 编程之美2016复赛题目
- 回顾微软编程之美2016复赛
- 2016 BOP 编程之美复赛心得
- 2016“编程之美“挑战赛 复赛整理
- hihoCoder 1159 扑克牌 编程之美2015初赛第二场
- hihoCoder 1160 攻城略地 编程之美2015初赛第二场
- hihoCoder #1156 : 彩色的树 2015编程之美初赛
- hihocoder 2015编程之美 资格赛 hihocoder 第三题 基站选址
- 编程之美2013年大赛解题思路--复赛
- 2013编程之美挑战赛复赛第二轮---招聘
- 2016 微软编程之美复赛题目中文翻译
- hihocoder 1170 机器人
- 【DP】 hihocoder #1170 : 机器人
- 2015-4-17,编程之美-hihoCoder-2月29日解答
- `2015 编程之美 资格赛 第一题 hihocoder 区间闰年 2月29 数量 模拟题
- hihoCoder 1161 八卦的小冰 编程之美2015初赛第二场
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- Android模拟器无法上网问题
- iOS开发中获取上月的起止时间(NSCalendar、NSDateComponents和NSDate的使用)
- Vijos P1577可怜的Oliver
- Android UI学习之TextView
- hihocoder #1170 机器人 && 编程之美2015复赛
- 开发android中,去掉标题,禁止Activity旋转
- openvswitch的安装和卸载
- Vijos P1571笨笨的导弹攻击
- POJ 1636 Prison rearrangement
- C#中Thread.IsBackground 属性
- Vijos P1369难解的问题
- 大型网站系统架构演化之路
- [JDK]什么是JDK