HLG 1022 Jiaozhu and SC -(二分查找)或(哈希函数处理字符串)

本文介绍了一种基于《星际争霸》游戏的电子竞技比赛胜负判断方法。通过输入参赛选手所选种族及其对战情况,利用结构体存储选手信息并采用二分查找或哈希表快速定位选手种族,进而根据游戏内的种族克制关系确定比赛结果。

链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1022

Description:

自从电子竞技在中国被认定为第99个正式体育项目,教主就投身其中,SC(StarCraft 星际争霸)他拿手的一款游戏,当然也有很多职业选手参与其中。
星际争霸中有3个种族:T(人族),P(神族),Z(虫族)而且每个玩家必须选择且只能选择一个种族来使用。
在职业电子竞技联赛中,每位职业选手都会固定使用某一个自己喜爱的种族。
在经过大量的比赛后,发现有如下的规律:
1.使用人族的选手总是能战胜虫族选手
2.使用虫族的选手总是能战胜神族选手
3.使用神族的选手总是能战胜人族选手
4.使用相同种族的选手对战总是产生平局
现在将告诉你每个选手的种族,并进行若干场比赛,要求你输出每场比赛的结果。

Input:

本题只有一组测试数据
第一行:N M (1 <= N, M<= 10000),N代表选手的数目,M代表比赛的场数。
接下来N行,每行首先给出选手名字(玩家的名字只由大写、小写字母、数字组成,其中没有空格,最长的名字占10个字符)接着是他的种族(用T、P、Z表示)
接下来M行,每行代表一场比赛,首先给出选手A的名字,接着给出选手B的名字。

Output:

对于每场比赛:
选手A胜利 输出"XiaoM Wins!"
选手B胜利 输出"TianT Wins!"
平局 输出"End in a draw!"

Sample Input:

4 4
JiaoZhu T
Jaedong Z
Chadalt T
LMJ Z
JiaoZhu Chadalt
Jaedong LMJ
JiaoZhu LMJ
LMJ Chadalt

Sample output:

End in a draw!
End in a draw!
XiaoM Wins!
TianT Wins!


解析代码如下:

#include <cstring>
#include <cstdio>
#include <iostream>
using namespace std;

typedef struct Competitor_ {
    char name[51];
    char grade;
}Competitor;

Competitor cp[10005];

int cmp(const void *a, const void *b) {
    Competitor *p1=(Competitor*)a;
    Competitor *p2=(Competitor*)b;
    return strcmp(p1->name, p2->name);
}

int binarySearch(const Competitor cp[], int left, int right, const char key_name[]) {
    right--;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (strcmp(cp[mid].name, key_name) > 0) {
            right = mid - 1;
        }else if(strcmp(cp[mid].name, key_name) < 0) {
            left = mid + 1;
        }else {
            return mid;
        }
    }
}

int main()
{
    int n, m;
    char name1[55], name2[55];
    while (scanf("%d%d", &n, &m) != EOF) {
        for (int i=0; i<n; i++) {
            scanf("%s %c", cp[i].name, &cp[i].grade);
        }
        qsort(cp, n, sizeof(cp[0]), cmp);
        for (int i=0; i<m; i++) {
            scanf("%s%s", name1, name2);
            int c1 = binarySearch(cp, 0, n, name1);
            int c2 = binarySearch(cp, 0, n, name2);
            if(cp[c1].grade == cp[c2].grade) {
                printf("End in a draw!\n");
            }
            if(cp[c1].grade == 'T' && cp[c2].grade == 'Z' || cp[c1].grade == 'Z' && cp[c2].grade == 'P' || cp[c1].grade == 'P' && cp[c2].grade == 'T') {
                printf("XiaoM Wins!\n");
            }
            if(cp[c1].grade == 'Z' && cp[c2].grade == 'T' || cp[c1].grade == 'P' && cp[c2].grade == 'Z' || cp[c1].grade == 'T' && cp[c2].grade == 'P') {
                printf("TianT Wins!\n");
            }
        }
    }
    return 0;
}
后续解法待续:

规律:利用哈希函数将字符串映射到数组中,利用下标实现快速查找。
代码:
#include<stdio.h>
#include<string.h>

unsigned int SDBMHash(char *str)
{
    unsigned int hash = 0;
    while (*str) {
        hash = (*str++) + (hash << 6) + (hash << 16) - hash;
    }
    return (hash & 0x7FFFFFFF);
}

int main()
{
    int a[100000];
    int len, len1, len2, x, y, m, n, z;
    char b[11], d[11], c[2];
 
    scanf("%d%d",&n, &m);
    for(int i=0; i<n; i++) {
        scanf("%s%s", b, c);
        z = SDBMHash(b)%100000;
        if(c[0]=='T')
            a[z] = 1;
        else if(c[0]=='Z')
            a[z] = 2;
        else
            a[z] = 3;
    }
    for(int i=0; i<m; i++) {
        x=0;y=0;
        scanf("%s%s",b,d);
        x = SDBMHash(b)%100000;
        y = SDBMHash(d)%100000;
        if(a[x]==a[y])
            printf("End in a draw!\n");
        else if((a[x]==1&&a[y]==2)||(a[x]==2&&a[y]==3)||(a[x]==3&&a[y]==1))
            printf("XiaoM Wins!\n");
        else
            printf("TianT Wins!\n");
    }
    return 0;
}



### PQ Function Technical Details Perceptual Quantizer (PQ) 是一种用于高动态范围(HDR)成像的标准化电光传递函数(EOTF)。它由 Dolby 实验室开发并被纳入 SMPTE ST 2084 标准中。该函数设计的目标是在人类视觉系统的感知特性下实现最佳量化效率[^1]。 #### 数学表达 PQ 函数的核心是一个复杂的幂律方程,其形式如下: ```python def pq_eotf_inverse(m): """ Inverse Perceptual Quantization Electro-Optical Transfer Function. Parameters: m : float or array-like, input signal value Returns: L : float or ndarray, output luminance in cd/m² """ a = 1.0993 b = 0.0045 c = 0.0181 d = 0.116985 e = 0.018680 g = 78.84375 M1 = ((c + d * pow(a, e)) / (a ** e)) M2 = (((e - 1) * d * pow(a, e - 1)) / (pow(e, e))) N = abs(2 ** (-m / 4) - c) L = max(N / M2, 0)**g return L ``` 此函数通过一系列参数调整来模拟人眼对亮度变化的敏感度,在低光照条件下提供更高的精度,而在高亮度区域则降低分辨率需求。 ### HLG Function Technical Details Hybrid Log-Gamma (HLG) 是另一种 HDR 编码方法,最初由 BBC 和 NHK 联合开发,并成为 ARIB STD-B67 的一部分。与 PQ 不同的是,HLG 设计得更简单以便实时广播处理。 #### 数学描述 HLG 使用分段定义的方式来进行信号到光学强度之间的映射关系: 对于输入值 \( E \leq 1/12 \),采用线性响应;当 \( E > 1/12 \), 则切换至对数模式计算输出亮度\( O \): \[ O(E)=\left\{\begin{matrix} L_{W}^{'}*E & ,& E<=1/12\\ (L_{W}-L_{B})log((E-E_{T})/(k*L_{W}))+(b-a)*L_{W}+a*(L_{W}+L_{B}) &, & otherwise \\ \end{matrix}\right. \] 其中各变量代表特定物理量常数值. 上述两种技术各有优劣:PQ 提供更好的画质表现但运算成本较高;而 HLG 更适合现有基础设施下的即时传输场景.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值