time limit per test 2 seconds
memory limit per test 256 megabytes
题目链接http://codeforces.com/contest/1157/problem/B
emmm,题目不难,但读错题目的话就疯狂WA6。。。我开始一直以为是每个变化只能用一次,连续的单个变化是ok的。。。然后就成了这样:
for (int i=0; i<n; i++)
if (v[s[i]-'0']>s[i]-'0'){
a[i]=v[s[i]-'0'];
while (s[i+1]==s[i]) {
i++;
a[i]=v[s[i]-'0'];
}
v[s[i]-'0']=-1;
}
else a[i]=s[i]-'0';
for (int i=0; i<n; i++)
printf ("%d",a[i]);
。。。。实际上的题意是这样的,让你找一个区间,把这个区间里的所有数都按照该变化变一次,求最大的那个。。。
我们从头开始找,只要v[num[i]]>num[i],我们就替换直到不成立
以下是AC代码:
#include <bits/stdc++.h>
using namespace std;
const int mac=2e5+10;
char s[mac];
int v[20],a[mac];
int main()
{
int n;
scanf ("%d",&n);
scanf ("%s",s);
for (int i=1; i<=9; i++)
scanf ("%d",&v[i]);
for (int i=0; i<n; i++) a[i]=s[i]-'0';
for (int i=0; i<n; i++)
if (v[a[i]]>a[i]){
a[i]=v[a[i]];i++;
while (v[a[i]]>=a[i] && i<n) a[i]=v[a[i]],i++;
break;
}
for (int i=0; i<n; i++)
printf ("%d",a[i]);
printf ("\n");
return 0;
}