1 条题解

  • 0
    @ 2025-6-16 11:52:58

    字符串权重比较 - 解题思路

    这段代码实现了一个比较两组字符串集合总权重的算法,核心思路是通过二进制权重计算来比较两组字符串的总体价值。

    算法核心思路

    1. 权重计算函数(calc)

      • 接收字符串并反转处理
      • 从最高位(1<<50)开始计算权重
      • 'W'字符增加当前位权值,'B'字符减少当前位权值
      • 相同前缀字符处理优化,后续位权值逐位减半
    2. 主处理流程

      • 读取测试用例数量T
      • 对每个测试用例:
        • 读取两组各3个字符串
        • 分别计算每组字符串的总权重(3个字符串权重之和)
        • 比较两组总权重,输出"Yes"或"No"
    3. 优化处理

      • 使用长整型(ll)防止数值溢出
      • 位运算优化权重计算
      • 字符串反转简化处理逻辑

    关键特点

    • 二进制权重设计:将字符串转换为二进制数值进行比较
    • 高效比较:通过数学计算替代直接字符串比较
    • 批量处理:支持多组测试用例连续处理
    • 结果明确:简单输出比较结果,无需复杂格式
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #define ll long long
    #define re register
    #define cs const
    
    char a[55];
    ll calc(int n){
    	ll ans=0;
    	for(int re i=1;i<=n;++i)
    		scanf("%s",a+i);
    	std::reverse(a+1,a+n+1);
    	int i=n;ll now=1ll<<50;
    	while(i>0&&a[i]==a[n]){
    		if(a[i]=='B')ans-=now;
    		else ans+=now;--i;
    	}now>>=1;
    	while(i>0){
    		if(a[i]=='W')ans+=now;
    		else ans-=now;--i,now>>=1;
    	}
    	return ans;
    }
    
    int id;
    void solve(){
    	scanf("%*s%d",&id);
    	ll c1=0,c2=0;int n1,n2,n3;
    	scanf("%d%d%d",&n1,&n2,&n3);
    	c1=calc(n1)+calc(n2)+calc(n3);
    	scanf("%d%d%d",&n1,&n2,&n3);
    	c2=calc(n1)+calc(n2)+calc(n3);
    	printf("Test %d: ",id);
    	puts(c1>=c2?"Yes":"No");
    }
    
    signed main(){
    #ifdef zxyoi
    	freopen("procrastination.in","r",stdin);
    #endif
    	int T;scanf("%d",&T);
    	while(T--)solve();
    	return 0;
    }
    
    
    • 1

    信息

    ID
    1932
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者