有一个密码锁,其有N位,每一位可以是一个0~9的数字,开启密码锁需要将锁上每一位数字转到解锁密码一致。这个类似你旅行用的行李箱上的密码锁,密码锁的每一位其实是一个圆形转盘,上面依次标了0,1,...9,对每一位来说可以正向或者逆向拨动,正向拨动时原有数字x会变成新的数字(x+1 mod 10),例如1->2,2->3,9->0;同理逆向拨动变为(x-1 mod 10)即9->8,5->4,0->9。定义对密码锁的一次操作:选择一个连续的区间[L,R],可以只包含一位即L==R,将这个区间的所有数字正向拨动或逆向拨动一次,注意要么全部正着拨,要么全逆着。例如:12397正向后变成23408,逆向后变成01286。给出密码锁初始和解锁需要的终止状态,问最少多少次操作能解锁。
 Input
  多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=5
  每组测试数据有相同的结构构成:
  每组数据有两行构成,第一行是密码锁的初始状态S,第二行是解锁的终止状态E,其中1<=len(S)=len(E)<=2500,且都由0~9构成
 Output
  每组数据一行输出,即最少需要的操作数。

简化分析,先对每一位重映射,目标转化为第i位需要正转L次变成目标位。简单的说就是把目标串变成'0000....000000000'。
第二次转化,因为目标是把所有的位置0,所以我们定义NewBit[i] = (Bit[i]-Bit[i-1]) mod 10;NewBit[0]=Bit[0]
Bit[]={0,0,0,.....,0}等价NewBit[]={0,0,.........,0},两个问题等价

对Bit[]的[L,R]区间整体位移,等价为对NewBit[]中NewBit[L]与NewBit[R]两个量操作,一个+1,一个-1.其中R=N-1时,没有R+1这项,只有NewBit[L]自己动。一次影响两个项,很容易想到贪心,每个NewBit[]只网一个方向变,即将一些项往正方向转,一些往负方向转,他们两类可以配对,若正的比负的多,用多出来的与R=N配对即可。

在NewBit[]中做一个简单N^2dp背包即可以求解。

具体DP的话就是f[i][j]表示处理完前i个数,正转操作的数量为j时,负方向最少要转多少次。

看了别人的AC代码其实也可以不用DP的样子...每次拿 需要正转次数最多 和需要负转次数最多的去强行配对似乎就行了?

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#define ll long long
#define ull unsigned long long
#define ui unsigned int
#define d double
#define ld long double
const int maxn=,modd=; int a[maxn],add[maxn],dec[maxn],pr[maxn],aft[maxn],f[maxn*];
int i,j,k,n,m;
char s[maxn],t[maxn]; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while(rx<''&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>='')ra=ra*+rx-,rx=getchar();return ra*fh;
} inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
inline void mins(int &a,int b){if(b<a)a=b;}
inline int MOD(int x){return x<?x+:x>?x-:x;}
int main(){
for(int T=read();T;T--){
scanf("%s%s",s+,t+);n=strlen(s+);int tmp;
for(i=;i<=n;i++)a[i]=MOD(t[i]-s[i]),add[i]=MOD(a[i]-a[i-]),dec[i]=-add[i],pr[i]=pr[i-]+add[i];
for(i=n,aft[n+]=;i;i--)aft[i]=aft[i+]+dec[i]; // for(i=1;i<=n;i++)printf(" %d",a[i]);puts(""); memset(f,,(pr[n]+)<<);
f[]=;
for(i=;i<=n;i++)if(add[i]){
tmp=dec[i];
for(j=pr[i],k=j-add[i];k>=;j--,k--)
mins(f[j]+=tmp,f[k]);
while(j>=)f[j--]+=tmp;
}
int ans=1e9;
for(i=;i<=pr[n]&&i<ans;i++)mins(ans,max(i,f[i]));
printf("%d\n",ans);
}
}

2018.4 UPD: 达成成就:2016年(嘴巴上)A掉GDOI2018的题目。

[51nod1357]密码锁 暨 GDOI2018d1t2的更多相关文章

  1. [51nod1357]密码锁

    有一个密码锁,其有N位,每一位可以是一个0~9的数字,开启密码锁需要将锁上每一位数字转到解锁密码一致.这个类似你旅行用的行李箱上的密码锁,密码锁的每一位其实是一个圆形转盘,上面依次标了0,1,...9 ...

  2. 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛

    比赛链接: http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/36 题目来源: 2014嘉杰信息杯ACM ...

  3. openjudge8469特殊密码锁[贪心]

    描述 有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态. 然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转.当然,如果你 ...

  4. 【6年开源路】海王星给你好看!FineUI v4.0正式版暨《FineUI3to4一键升级工具》发布!

    去年10-28号,我发布了一篇文章<海王星给你好看!FineUI v4.0公测版发布暨<你找BUG我送书>活动开始>,标志着FineUI开始向4.0版本迈进.经过4个月3个公测 ...

  5. 2017亚洲VR&AR博览会暨高峰论坛

    2017亚洲VR&AR博览会暨高峰论坛 2017 Asia VR&AR Fair & Summit(VR&AR Fair 2017) 活动介绍活动时间: 2017年3月 ...

  6. NOI OpenJudge 8469 特殊密码锁 Label贪心

    描述 有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态. 然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转.当然,如果你 ...

  7. 【转】ACM/ICPC生涯总结暨退役宣言—alpc55

    转自:http://hi.baidu.com/accplaystation/item/ca4c2ec565fa0b7fced4f811 ACM/ICPC生涯总结暨退役宣言—alpc55 前言 早就该写 ...

  8. Android 九宫格密码锁进入程序

    设置九宫格密码锁进入程序,设置,重置,取消等,安卓巴士地址http://www.apkbus.com/forum.php?mod=viewthread&tid=182620&extra ...

  9. iOS开发——高级技术&密码锁功能的实现

    密码锁功能的实现 一个ios手势密码功能实现 ipad/iphone 都可以用 没有使用图片,里面可以通过view自己添加 keychain做的数据持久化,利用苹果官方KeychainItemWrap ...

随机推荐

  1. Which cryptsetup

    Which cryptsetup Rpm –qf ‘which cryptsetup’ 安装加密工具: 设置加密分区 Crptsetup luksFormat Echo –n “xuegod123”  ...

  2. kimbits_USACO

    StringsobitsKim Schrijvers Consider an ordered set S of strings of N (1 <= N <= 31) bits. Bits ...

  3. devm_xxx机制

    前言 devm是内核提供的基础机制,用于方便驱动开发者所分配资源的自动回收.参考内核文档devres.txt.总的来说,就是驱动开发者只需要调用这类接口分配期望的资源,不用关心释放问题.这些资源的释放 ...

  4. Oracle with重用子查询

    --with 重用子查询对于多次使用相同子查询的复杂查询语句来说,用户可能会将查询语句分成两条语句执行.第一条语句将子查询结果存放到临时表,第二条查询语句使用临时表处理数据.从 Oracle 9i 开 ...

  5. C基础 寻找随机函数的G点

    引言 随机函数算法应该是计算机史上最重要的十大算法之一吧. 而C中使用的随机函数 #include <stdlib.h> _Check_return_ _ACRTIMP int __cde ...

  6. java字节码指令列表(转)

    字节码 助记符 指令含义 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将i ...

  7. Elasticsearch( 插件开发)

    elasticsearch5.2.2 插件开发(一) Scripting plugins:这个插件本质来说,就是会调用用户的脚本,所以可以执行任何的程序,举例的话,可以通过这个插件,支持javascr ...

  8. y=y||'world'与y=y?y:'world'

    1.y=y||’world’ function log(x,y){ y=y||’world’; console.log(x,y) } log(‘hello’)===>hello world lo ...

  9. Python Flask wtfroms组件

    简介 WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 安装: pip3 install wtforms 用户登录注册示例 1. 用户登录 当用户登录时候,需要对 ...

  10. ejs模板在express里的默认文件夹路径修改

    默认的是这句: app.set('view engine','ejs') ===>/views文件夹 我想要变成/websong app.set('views','webosg'); app.s ...