ygg plz(正经贴)
  • 板块灌水区
  • 楼主Break_Over
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/4/13 15:56
  • 上次更新2024/4/13 17:30:21
查看原帖
ygg plz(正经贴)
1058208
Break_Over楼主2024/4/13 15:56

2000ms为啥会T?

题目链接

求分析复杂度:

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <ctime>
using namespace std;
int n,dp[27][27],w,num;
long long ans;
char a,b,s1[100005],s2[100005],anu[100005],ch;
int main(){
	double wd=((clock_t)1000);
	double st=clock();
	scanf("%s%s%d",s1,s2,&n);
	if(strlen(s1)!=strlen(s2)){
		printf("-1");
		return 0;
	}
	scanf("%d",&n);
	for(int i=0;i<=26;i++){
		for(int j=0;j<=26;j++){
			dp[i][j]=1e9;
		}
	}
	for(int i=1;i<=n;i++){
		while(1){
			char c=getchar();
			if(c>='a'&&c<='z'){
				a=c;
				break;
			}
		}
		while(1){
			char c=getchar();
			if(c>='a'&&c<='z'){
				b=c;
				break;
			}
		}
		scanf("%d",&w);
		int na=a-'a',nb=b-'a';
		dp[na][nb]=min(w,dp[na][nb]);
	}
	for(int i=0;i<26;i++){
		dp[i][i]=0;
	}
	for(int i=0;i<26;i++){
		for(int j=0;j<26;j++){
			for(int k=0;k<26;k++){
				if(dp[j][i]+dp[i][k]<dp[j][k]){
					dp[j][k]=dp[j][i]+dp[i][k];
				}
			}
		}
	}
	for(int i=0;i<strlen(s1);i++){
		num=1e9;
		for(int j=0;j<26;j++){
			if(dp[s2[i]-'a'][j]==1e9||dp[s1[i]-'a'][j]==1e9){
				continue;
			}
			if(dp[s2[i]-'a'][j]+dp[s1[i]-'a'][j]<num){
				num=dp[s2[i]-'a'][j]+dp[s1[i]-'a'][j];
				ch=j+'a';
			}
		}
		if(num==1e9){
			printf("-1");
			return 0;
		}
		ans+=num;
		anu[i]=ch;
	}
	printf("%lld\n",ans);
	printf("%s",anu);
	return 0;
}
2024/4/13 15:56
加载中...