hihocoder 1251 Today Is a Rainy Day( 2015北京区域赛C题)
2016-10-28 22:19
344 查看
首先两种操作,一次性执行完2操作,最后再用1操作比混合着用1操作快。
所以先处理一次性执行操作完2操作,
也就是由123456 –> a1,a2,a3,a4,a5,a6
最多6 ** 6种转移
bfs预处理
最后再执行1操作,但不能每次都比较一次原序列和经过一系列2操作的现在的序列,需要一点技巧。(Tle了4发)
对于每一个数字k,统计它在the final list出现的次数c[ k },再记录它应该是数字k0的个数f[ k ][ k0 }
然后做变换时123456 –> a[1],a[2],a[3],a[4],a[5],a[6]
对于数字k,他还要做的变换次数=c[k}-f[k][a[ k } }
所以先处理一次性执行操作完2操作,
也就是由123456 –> a1,a2,a3,a4,a5,a6
最多6 ** 6种转移
bfs预处理
最后再执行1操作,但不能每次都比较一次原序列和经过一系列2操作的现在的序列,需要一点技巧。(Tle了4发)
对于每一个数字k,统计它在the final list出现的次数c[ k },再记录它应该是数字k0的个数f[ k ][ k0 }
然后做变换时123456 –> a[1],a[2],a[3],a[4],a[5],a[6]
对于数字k,他还要做的变换次数=c[k}-f[k][a[ k } }
#include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> #include <stack> #include <vector> #include <cstring> #include <queue> #define msc(X) memset(X,-1,sizeof(X)) #define ms(X) memset(X,0,sizeof(X)) typedef long long LL; using namespace std; char org[120],nsr[120]; struct _State{ int id,turn; }; int turns[47000]; int getid(int *a) { int ret=0; for(int i=0;i<6;i++) ret=a[i]%6+6*ret; return ret; } int geta(int id,int k) { while(++k<6) id/=6; return id%6==0?6:id%6; } void inti(void) { int a[6]={1,2,3,4,5,6}; msc(turns); turns[getid(a)]=0; queue<struct _State> q; struct _State tmp; tmp.id=getid(a),tmp.turn=0; q.push(tmp); while(!q.empty()){ tmp=q.front();q.pop(); int b[6]; for(int i=1;i<=6;i++) for(int j=1;j<=6;j++) if(i!=j){ struct _State tn; for(int k=0;k<6;k++) if((b[k]=geta(tmp.id,k))==i) b[k]=j; tn.id=getid(b); if(turns[tn.id]==-1){ turns[tn.id]=tn.turn=tmp.turn+1; q.push(tn); } } } } int main(int argc, char const *argv[]) { inti(); for(int id=0;id<46656;id++) if(turns[id]==-1) turns[id]=0x3f3f3f3f;//记得把无法直接用操作2达到的标记一下 while(scanf("%s%s",org,nsr)!=EOF){ int ans=120; int f[7][7]; int c[7]; ms(f); ms(c); for(int i=0;nsr[i];i++) { c[nsr[i]-'0']++; f[nsr[i]-'0'][org[i]-'0']++; } for(int id=0;id<46656;id++) { int tmp=turns[id]; int a[6]; for(int k=0;k<6;k++) { a[k]=geta(id,k); tmp+=c[k+1]-f[k+1][a[k]]; } ans=min(ans,tmp); } printf("%d\n",ans); } return 0; }
相关文章推荐
- hihocoder 1251 Today Is a Rainy Day 2015北京区域赛C
- hihocoder 1251 Today Is a Rainy Day (2015ICPC北京C题)
- 【BFS】【枚举】HihoCoder - 1251 - The 2015 ACM-ICPC Asia Beijing Regional Contest - C - Today Is a Rainy Day
- 暴力 hihoCoder 1251 Today Is a Rainy Day (15北京C)
- 2015 北京区域赛 Today Is a Rainy Day(暴搜)
- hihocoder1251 Today Is a Rainy Day(暴力)
- 【hihocoder1251】Today is a rainy day
- 2015ACM-ICPC 北京赛区 Problem C. Today Is a Rainy Day
- ICPC 2015 北京 Today Is a Rainy Day
- hihoCoder 1251 Today Is a Rainy Day(暴力)
- BFS预处理 hihoCoder1251 Today Is a Rainy Day
- 2015Beijing区域赛(Today Is a Rainy Day-暴搜)
- UVALive7263-Today Is a Rainy Day(2015ICPC北京C题)-模拟+BFS
- UVALive - 7263 Today Is a Rainy Day (BFS预处理)
- UVALive 7263 Today Is a Rainy Day(BFS预处理)
- hihocoder 1252 2015北京赛区区域赛D
- [uvalive 7263] Today Is a Rainy Day(暴力,BFS,dp)
- hihocoder 1257 Snake Carpet 2015 ACM_ICPC 北京区域赛 I 题
- hihoCoder 1257 Snake Carpet (构造题+详解) 2015北京区域赛
- hihoCoder 1257 Snake Carpet 2015北京区域赛