好奇一个问题
查看原帖
好奇一个问题
691463
somebody_kang楼主2024/10/29 09:28

一开始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;
}
2024/10/29 09:28
加载中...