一开始64pts,WA的点都是数值较大的点,我推测是爆精度了,但是我一开始是直接#define int long long的,所以百思不得其解。但是后面索性#define ll long long把int数组和ll数组分开,竟然过了?!求大佬解析一下qwq
64pts Code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[114514][8],v[10],a[114514],e[8];
signed main(){
e[0]=1;
for(int i=1;i<=6;++i){
e[i]=e[i-1]*10;
}
int n,c,T;
cin>>c>>T;
while(T--){
memset(dp,0x3f,sizeof(dp));
string s;
cin>>s;
int n=s.length();
for(int i=1;i<=n;++i) a[i]=s[i-1]-'0';
reverse(a+1,a+n+1);
for(int i=1;i<=9;++i) cin>>v[i];
dp[0][0]=0;
for(int i=1;i<=n;++i){
dp[i][0]=dp[i-1][0]+v[a[i]];
for(int j=1;j<=min(6ll,i);++j){
dp[i][j]=min(dp[i-1][j]+v[a[i]],dp[i-1][j-1]+a[i]*e[j-1]);
}
}
int ans=0x7f7f7f7f;
for(int i=0;i<=min(6ll,n);++i) ans=min(ans,dp[n][i]);
cout<<ans<<endl;
}
return 0;
}
100 pts Code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll dp[114514][8],e[8];
int v[10],a[114514];
signed main(){
e[0]=1;
for(int i=1;i<=6;++i){
e[i]=e[i-1]*10;
}
int n,c,T;
cin>>c>>T;
while(T--){
memset(dp,0x3f,sizeof(dp));
string s;
cin>>s;
int n=s.length();
for(int i=1;i<=n;++i) a[i]=s[i-1]-'0';
reverse(a+1,a+n+1);
for(int i=1;i<=9;++i) cin>>v[i];
dp[0][0]=0;
for(int i=1;i<=n;++i){
dp[i][0]=dp[i-1][0]+v[a[i]];
for(int j=1;j<=min(6,i);++j){
dp[i][j]=min(dp[i-1][j]+v[a[i]],dp[i-1][j-1]+a[i]*e[j-1]);
}
}
ll ans=dp[n][0];
for(int i=1;i<=min(6,n);++i) ans=min(ans,dp[n][i]);
cout<<ans<<endl;
}
return 0;
}