(ac? wrong?罚时规则)

本文介绍了一个用于ACM竞赛计分的程序实现细节,包括读取输入数据、处理不同状态(如AC、WA等)、计算每个通过题目的首次提交时间和罚时等关键步骤。通过对提交记录的分析,该程序能够准确地给出参赛者的得分和总罚时。


13 51002 00:02 AC1003 00:05 WA1003 00:06 WA1003 00:07 AC1002 04:59 AC
 

Sample Output

2 49


#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
struct p
{
    int a;
    int b;
    int c;
    char d[2];
    int m=0;//标记能a的
    int n=0;//能a却没a的
} x[10000];
int main()
{
    int t,a,b,i,j,ge,sum;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&a,&b);
        ge=0;
        sum=0;
        for(i=0; i<=b-1; i++)
        {
            scanf("%d %d:%d %s",&x[i].a,&x[i].b,&x[i].c,x[i].d);
            if(strcmp(x[i].d,"AC")==0)
            {
                for(j=i-1; j>=0; j--)
                    if(strcmp(x[j].d,"AC")==0&&x[i].a==x[j].a)
                        break;
                if(j<0)
                {
                    ge++;
                    x[i].m=1;
                }
            }
        }
        for(i=0; i<=b-1; i++)
            if(x[i].m==1)
                for(j=0; j<=b-1; j++)
                    if(x[j].a==x[i].a)
                        x[j].m=1;
        for(i=0; i<=b-1; i++)
        {
            if(strcmp(x[i].d,"AC")==0&&x[i].n==0)
            {
                for(j=0; j<=b-1; j++)
                    if(x[j].a==x[i].a)
                        x[j].n=1;
                sum+=x[i].b*60+x[i].c;
            }
            else
            {
                if(x[i].m==1)
                {
                    for(j=0; j<=i-1; j++)
                        if(x[j].a==x[i].a&&strcmp(x[j].d,"AC")==0)
                            break;
                    if(j>i-1)
                        sum+=20;
                }
            }
        }
        printf("%d %d\n",ge,sum);
        memset(x,0,sizeof(x));


    }
    return 0;
}

<think>好的,我现在需要解决用户在使用StringRedisTemplate操作ZSet出现的WRONGTYPE错误。首先,我得回顾一下用户提供的引用内容,特别是关于RedisTemplate和StringRedisTemplate的配置部分。根据引用[1]和[2],用户可能自定义了RedisTemplate,或者默认配置被覆盖,导致类型不匹配。首先,WRONGTYPE错误通常是因为Redis键的类型与操作不匹配。比如,用户可能试图用ZSet命令操作一个字符串类型的键。但用户已经确认目标键实际类型是zset,所以问题可能出在序列化配置上。StringRedisTemplate默认使用的是String序列化器,而如果之前使用了不同的RedisTemplate(比如自定义的),可能存储数据用了不同的序列化方式,导致类型冲突。例如,自定义的RedisTemplate可能使用了Jackson序列化器,而StringRedisTemplate使用字符串,这会导致读取类型不匹配。引用[2]中的配置示例显示,自定义的RedisTemplate设置了key和value的序列化方式,而StringRedisTemplate是单独配置的。如果两者混用同一个键,可能会因为序列化方式不同,导致数据类型识别错误,从而引发WRONGTYPE错误。解决方案可能包括:确保操作的键是由StringRedisTemplate正确序列化的,或者检查是否有其他代码在使用不同的RedisTemplate操作同一个键,导致类型被改变。此外,用户需要确保在操作ZSet,分数值确实是数值类型,而不是字符串,这也会引发错误。另外,引用[3]中的测试代码显示,直接使用RedisTemplate操作,如果未正确配置序列化,存储的数据可能包含类型信息,而StringRedisTemplate无法正确解析这些数据,导致类型冲突。因此,统一使用StringRedisTemplate,并确保所有操作都使用它,可能解决问题。 最后,可能需要检查Redis连接配置,如引用[4]中的密码和端口是否正确,确保操作的是正确的Redis实例,避免键名冲突或误操作其他数据库。</think>### 解决StringRedisTemplate操作ZSetWRONGTYPE错误的完整方案 #### 一、错误根源分析 WRONGTYPE错误的核心原因是**键值类型不匹配**,具体表现为: 1. 目标键实际存储类型非ZSet[^4] 2. 不同RedisTemplate实例的序列化策略冲突[^1][^2] 3. 分数值类型错误(非数值类型) #### 二、验证步骤 ##### 1. 确认键类型 通过Redis命令验证键类型: ```bash > TYPE user_rank zset # 正确应为zset类型 ``` 若返回类型非zset,需删除重建: ```java stringRedisTemplate.delete("user_rank"); ``` ##### 2. 检查序列化配置 对比自定义RedisTemplate与StringRedisTemplate的序列化策略: ```java // 自定义RedisTemplate配置示例[^2] @Bean public RedisTemplate<String, Object> redisTemplate(...) { // key序列化方式为String template.setKeySerializer(RedisSerializer.string()); // value序列化方式为JSON template.setValueSerializer(RedisSerializer.json()); } // StringRedisTemplate默认配置[^1] public StringRedisTemplate() { setKeySerializer(RedisSerializer.string()); setValueSerializer(RedisSerializer.string()); setHashKeySerializer(RedisSerializer.string()); setHashValueSerializer(RedisSerializer.string()); } ``` **关键冲突点**:当两个Template操作同一键,JSON序列化的value会导致StringRedisTemplate解析失败。 #### 三、解决方案 ##### 方案1:统一使用StringRedisTemplate ```java // 确保所有ZSet操作使用同一Template实例 stringRedisTemplate.opsForZSet().add("user_rank", "userA", 95.5); // 验证数据格式 Set<byte[]> rawData = stringRedisTemplate.getConnectionFactory() .getConnection().zRange("user_rank".getBytes(), 0, -1); // 正确输出示例:userA -> 95.5的二进制表示 ``` ##### 方案2:修复序列化冲突 当需要混合使用,统一键的序列化策略: ```java // 自定义RedisTemplate配置增加ZSet序列化 template.setHashValueSerializer(RedisSerializer.string()); template.setZSetSerializer(RedisSerializer.string()); ``` ##### 方案3:强制类型校验 ```java // 操作前执行类型检查 if (stringRedisTemplate.type("user_rank") != DataType.ZSET) { stringRedisTemplate.delete("user_rank"); } ``` #### 四、数学验证模型 定义键值类型一致性方程: $$ \forall k \in \text{Keys}, \exists T \in \{\text{ZSET}\} \Rightarrow \text{op}(k) \in \text{Methods}(T) $$ 其中$T$表示键的数据类型,$\text{op}(k)$表示对键的操作方法[^4] #### 五、操作对照表 | 错误场景 | 正确操作 | Redis命令等价 | |---------|---------|--------------| | 操作非ZSet键 | 删除重建键 | DEL + ZADD | | 混合序列化 | 统一String序列化 | SET vs ZADD | | 分数类型错误 | 强制数值转换 | ZADD 95.5 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值