比赛结束后,立马和队友开了一场重现,然后被暴打。
 J题是说,给你一把锁,有4位数,每位是0-9,然后给你目前锁的状态,和密码状态,你可以将连续的几个位置同时向上或下拨动,或者你单个位置拨动,问你最后需要几步。
常见的解法应该都是bfs,打个表,从0000开始拨动到任意位置所需的最小步,我一开始也是这么想的,但是不知道为什么脑子一抽最后选择了状压dp。
解法:
 很容易知道,一个位置要么往上拨要么往下拨,那么每一位其实就是2种情况,4位就是222*2=16种情况。
 如果所有位置单独拨动的话ans=need[1]+need[2]+need[3]+need[3],need[i]即第i位从初始态拨到最终态所需的步数。
 如果当连续的两位(i,j)同时向上(或下)拨动,需要的最小步数很容易发现是max(need[i],need[j])。
 如果当连续的三位(i,j,k)同时拨动,那么就有三种情况,前两种是need[i]或need[k]是最小的,那么显而易见就会退化成连续两位(i,j)拨动的情况,第三种就是need[j]是最小的,那么这时候,很显然,j是最先到达最终态的,那么这时候将i和k分别拨完剩下的步数就行了,那么ans=need[j]+(need[i]-need[j])+(need[k]-need[j]) 即ans=need[i]+need[k]-need[j]。
 如果当连续的四位(i,j,k,t)同时拨动,那么就有四种情况,前两种就是need[i]或need[t]最小的,那么显然就会退化成连续三位(i,j,k)拨动的情况,那么剩下两种就是need[j]或need[k]最小的,很容易得到ans=need[i]+max(need[k],need[t])-need[j]和ans=need[t]+max(need[i],need[j])-need[k],即是连续三位拨动和连续两位拨动的结合体。
 除了上述,还要考虑一种情况,当某位need[x]==0时,此时可以将它连同其他的一起拨动,最后再拨回原来的位置,也就是说此时必定有ans<=10。

#include <iostream>
#include<bits/stdc++.h>
#define scd(x) scanf("%d",&x)
#define scdd(x,y) scanf("%d%d",&x,&y)
#define scddd(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define mst(x,y) memset(x,y,sizeof(x));
using namespace std;
typedef long long ll;
const int maxn=1e2+5;
int a[10],b[10];
int sum(int p[5],int len)
{int mn=100,mx=0;if(len==4){for(int i=1;i<=4;i++)mn=min(mn,p[i]),mx=max(mx,p[i]);if(p[2]==mn)return p[1]+max(p[3],p[4])-p[2];if(p[3]==mn)return max(p[1],p[2])+p[4]-p[3];if(p[1]==mn)return sum(p+1,3);else return sum(p,3);}else{for(int i=1;i<=3;i++)mn=min(mn,p[i]),mx=max(mx,p[i]);if(mn==p[2])return p[1]+p[3]-p[2];return mx;}
}
int g(int k,int flag)
{if(flag==0){return a[k]<=b[k]?b[k]-a[k]:b[k]+10-a[k];}return a[k]>=b[k]?a[k]-b[k]:a[k]+10-b[k];
}
int main()
{#ifdef localfreopen("1.txt","r",stdin);#endif // localint T;scd(T);while(T--){int ans=100;char s[maxn];scanf("%s",s+1);for(int i=1;i<=4;i++)a[i]=s[i]-'0';scanf("%s",s+1);for(int i=1;i<=4;i++)b[i]=s[i]-'0';for(int i=0;i<=(1<<4)-1;i++){int t=i;int p[5];int x[5];for(int j=1;j<=4;j++)x[j]=(t>>(j-1))&1;for(int j=1;j<=4;j++)p[j]=g(j,x[j]);for(int j=1;j<=4;j++)if(p[j]==0)ans=min(ans,10);if(x[2]==x[3])//2==3{if(x[1]==x[2])//1==2==3{if(x[4]==x[2])//1==2==3==4ans=min(ans,sum(p,4));else//1==2==3!=4ans=min(ans,sum(p,3)+p[4]);}else if(x[4]==x[2])//1!=2==3==4ans=min(ans,sum(p+1,3)+p[1]);else//0!=1==2!=3ans=min(p[1]+max(p[2],p[3])+p[4],ans);}else if(x[1]==x[2]&&x[3]==x[4])ans=min(ans,max(p[1],p[2])+max(p[3],p[4]));else if(x[1]==x[2]&&x[3]!=x[4])ans=min(ans,max(p[1],p[2])+p[3]+p[4]);else if(x[1]!=x[2]&&x[3]==x[4])ans=min(ans,p[1]+p[2]+max(p[3],p[4]));else ans=min(ans,p[1]+p[2]+p[3]+p[4]);}printf("%d\n",ans);}return 0;
}

只能说还是bfs简单多了,不知道为什么硬要想状压dp折磨自己,要考虑这么多种情况。

2021 icpc 沈阳 J-Luggage Lock相关推荐

  1. 2021 ICPC沈阳 J.Luggage Lock(bfs,模拟)

    题目描述 题目链接 题目分析 这是一道很明显的bfs+模拟的题(和八数码是一类题)这是一道很明显的bfs+模拟的题(和八数码是一类题)这是一道很明显的bfs+模拟的题(和八数码是一类题) 因为起点和终 ...

  2. 2021 ICPC 沈阳赛区J题 Luggage Lock

    2021 ICPC 沈阳赛区J题 Luggage Lock 题意 有TTT组样例,其中每组样例为: 给定一个密码为b0b1b2b3b_0b_1b_2b_3b0​b1​b2​b3​的密码锁,已知当前密码 ...

  3. 2021 ICPC 沈阳站 D题 Journey to Un‘Goro (打表+找规律)

    2021 ICPC 沈阳站 D.Journey to Un'Goro [链接][http://codeforces.com/gym/103202/problem/D](http://codeforce ...

  4. 2021年区域赛ICPC沈阳站J-Luggage Lock(代码简洁)

    题意:将给一个4位的锁转到另一个四位的锁,可以一次转动多个连续的锁+1或者-1,问多少次可以转成目标锁 输入 6 1234 2345 1234 0123 1234 2267 1234 3401 123 ...

  5. 分类讨论 ---- 2021 icpc 沈阳 L Linear Fractional Transformation (思维题)

    题目链接 题目大意 给你一个线性变换函数f(z)=az+bcz+df(z)=\frac{az+b}{cz+d}f(z)=cz+daz+b​,现在把取值范围扩展到复数域.给你3个等式 f(z1)=w1f ...

  6. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

  7. 2021 ICPC 沈阳站总结

    热身赛 4道原题,3道水题+1道防AK(乱搞?)题,10min水出前3题提前下班 正式赛 题目有梯度,给出题人点赞! 开场前1h签了5个到,当时排名很靠前.之后就3人卡3题(ILM),I 我之前一直手 ...

  8. 第46届icpc 沈阳 J-Luggage Lock(思维 + 爆搜 / 队友玄学出法, 还没看懂)

    第46届icpc 沈阳 J-Luggage Lock(思维 + 爆搜 / 队友玄学出法, 还没看懂) 题目来源:第46届icpc 沈阳 J-Luggage Lock 题意: 给出两个四位数的密码锁a和 ...

  9. 21年icpc沈阳站记录

    icpc沈阳站记录 2021.11.22凌晨 从昨晚紧张到辗转反侧,虽然早就做好了打铁的心理准备,但待到比赛最后一刻两道铜牌题还没出时,满脑子的不甘心.当然最后肯定铁了395/576. 11.21也就 ...

最新文章

  1. MySQL面试题 | 附答案解析(十四)
  2. Win2008 r2 下修改mysql data目录的方法
  3. 有时间看看这个方法 会不会 避免 xss
  4. wdcp+定时运营php_wdcp设置计划任务
  5. python抓取html中特定的数据库,Python抓取网页中内容,正则分析后存入mysql数据库...
  6. 在大厂做螺丝钉?还是去新赛道攻城略地?看看这届年轻人怎么说
  7. Android应用程序管理系列(二)——PackageManager 包管理者
  8. 基于netty4.x开发时间服务器
  9. Java数组去重的方法
  10. golang errors 取 错误 信息_golang-标准errors包的学习
  11. wordpress文章增加行楷和魏碑字体
  12. 随笔(一)—2018-1-23-ANU暑期学校-无题
  13. 互联网公司各岗位真实工作内容起底
  14. 浅谈垂心四面体的垂心组
  15. Github / Gitlab Actions 中的 cron 格式 和设置方法
  16. 漂洋过海去学习,一文读懂程序员如何从初级升级到高级
  17. 云计算 | Gartner最新IaaS魔力象限详读
  18. Whitelabel Error Page 解决办法
  19. 国外十几种国外撸美金项目适合小白们
  20. je学习笔记一:jsp页面

热门文章

  1. MySQL 数据表优化设计(六):id 该如何选择数据类型?
  2. 阿拉伯数字转化为中文的数字(金额)
  3. 1112_Vue+SpringBoot+Mybatis的简单员工管理项目
  4. 最全阿里面试题:已拿offer,阿里P8岗位完整阿里技术面试题目,这些面试题你能答出多少
  5. 未来科学技十幻想画计算机,未来世界科幻画图片 你憧憬过这样的未来吗
  6. 联想家悦微型计算机,联想家悦台式电脑拆机知识分享
  7. 【算法竞赛学习笔记】莫队算法-超优雅的暴力算法
  8. WPF输入框双向绑定Decimal类等数据无法输入小数点
  9. 《数据结构》C语言版 链表的基本操作实现
  10. 冻结训练的理解与使用