
4111:判断游戏胜者-Who Is the Winner
总时间限制: 1000ms 内存限制: 65536kB
描述
Alice和Bob在玩一个游戏,每一局中他们每人获得一个16进制数串,计算它对应的二进制数串中有多少个连续的1序列块(单个的1也算作序列块)。块数多者胜利,请判断游戏的胜者并输出,若平局则输出Tie,比如样例中的第一组数据为Alice: 0xfa425 Bob: 0xab3672。Alice的数据转换为2进制串后为11111010010000100101, 其中有6个连续的1序列块。Bob的数据转换为2进制串后为 101010110011011001110010 其中有8个序列块,故胜者为Bob。
输入
第一行为游戏局数正整数n,接下来n行每行由两部分组成,前者是Alice获得的16进制数串,后者是Bob获得的16进制数串,中间用空格隔开。
输出
每一行输出一局的胜者。
样例输入
2
0xfa425 0xab3672
0x52c6 0xf429
样例输出
Bob
Tie
问题链接:Bailian4111 判断游戏胜者-Who Is the Winner
问题简述:(略)
问题分析:题目中没有指出输入的16进制字符串的长度,所以用整数来存储16进制字符串有可能会溢出,只能用字符串来处理。如果用C++语言来实现,则用string类型存储字符串,存储上是安全的。这里用C语言来实现,需要把字符数组声明得大一些。实际上,任何计算其数据规模也是有限度的,不可能是无限度的。
程序说明:程序中用函数strtok()来计算“1序列块”,也可以用原始的字符处理来计算。
参考链接:(略)
题记:(略)
AC的C++语言程序如下:
/* Bailian4111 判断游戏胜者-Who Is the Winner */
#include
#include
#include
char digits[16][5] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
char a[1024], b[1024], t[4096];
int cnt(char s[])
{
t[0] = ';'for
( int= i 2 ;[ s]i;++ i)strcat
(,tisdigit ([s]i)? [ digits[s]i- '0' ]: [ digits[s]i- 'a' + 10 ]);int
= cnt 0 ;char
* =p strtok (,t"0" );while
( )p++ {
cnt;=
p strtok (NULL,"0" );}
return
; cnt}
int
main ()int
{
; nscanf
("%d",& )n;while
( --n)scanf {
("%s%s",, a) b;int
= acnt cnt ()a,= bcnt cnt ()b;printf
("%s\n",== acnt ? bcnt "Tie" : ( ?acnt > bcnt "Alice" : "Bob" ));}
return
0 ;}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)