题意:输入一个数a和一个长度为10的数组,数组存入9个1~9的数。
数a的每一位数字代表数组的地址,取数a的一段非空连续子串,若对应地址内的数字大于该位数字,将该位替换,使数a变成可能最大值。
思路:从左往右找,因为高位替换一定比低位替换的值大。
#include<stdio.h> #include<math.h> #include<string.h> int main() { int n,f[10],i,s[200010],d,flag; char a[200010]; while(~scanf("%d",&n)) { scanf("%s",&a); for(i=0;i<n;i++) s[i]=a[i]-'0'; for(i=1;i<=9;i++) scanf("%d",&f[i]); for(i=0,flag=0;i<n;i++) { d=s[i]; if(f[d]>s[i]) { s[i]=f[d]; flag=1; } else if(f[d]<s[i]){ if(flag==1) break; } } for(i=0;i<n;i++) printf("%d",s[i]); printf("\n"); } }