3 6
3
5
3
5
这个题只有1-9九个数字,我们可以求一个9的全排列,但是我们需要check一个排列行不行
一种容易想到的方法就是O(n)扫边字符串就可以了
但是这样复杂度并不能通过
这里继续考虑这九种数字
每次移动都是在九种数字的任意两种之间
那么我们处理出相邻的两数字出现的次数
然后check的时候只需要考虑对于一个排列枚举两种数字,然后算出距离×出现次数的和就可以了
int a[10],ans = inf,p[maxn],pos[10]; int len,num[66][66] ; char s[maxn]; int cal() { int temp=0; for(int i=1 ; i<=9 ; i++) pos[a[i]] = i; for(int i=1 ; i<=9 ; i++) for(int j=1 ; j<=9 ; j++) temp+=abs(pos[i]-pos[j])*num[i][j]; return temp+len+abs(pos[p[1]] - pos[a[1]] ); } int main() { scanf("%s",s+1); len = strlen(s+1); rep(i,1,len ) p[i] = s[i]-‘0‘; for(int i=1 ; i<len ; i++)num[p[i]][p[i+1]]++; rep(i,1,9) a[i] = i; do { ans = min(ans,cal()); } while(next_permutation(a+1,a+1+9)); out(ans); return 0; }
ICPC Southeast USA 2020 Regional Contest Problem A: Ant Typing(思维)
原文:https://www.cnblogs.com/UpMing/p/14645290.html