用Python做50道ACM之《Counterfeit Dollar 》

4.Counterfeit Dollar

http://acm.fzu.edu.cn/problem.php?pid=1003

由于只有一枚是假的,因此若出现左右不平衡的情况,则没有放在天枰上的银币一定是真的。先根据第一和第二次称重的结果情况来确定出一定是真的银币以及可能是假的银币,然后在第三次称重重,若出现可能是假的银币在此次称重后确定的结论和之前的结论矛盾,则该银币为真,否则为假。

import sys

lines=sys.stdin.readlines()
if lines:
# 包含每一枚银币信息的字典
    dic={x:{'isreal':False,'info':['unknown','uncertain']} for x in range(ord('A'),ord('L')+1)}
# 测试用例数
    case_num=int(lines[0].strip())

    for case in range(0,case_num):
        time1=list(lines[1+case].rstrip().split(' '))
        time2=list(lines[2+case].rstrip().split(' '))
        time3=list(lines[3+case].rstrip().split(' '))
        for time in time1,time2,time3:
            time[0]=list(time[0])
            time[1]=list(time[1])
        for time in time1,time2,time3:
            ords=[]
            ords.extend(ord(x) for x in time[0])
            ords.extend(ord(x) for x in time[1])
            if time[2]=='even':
                for key in ords:
                    dic[key]['isreal']=True
                    dic[key]['info']=['real','certain']
            else:
                for key in dic:
                    if not key in ords:
                        dic[key]['isreal']=True
                        dic[key]['info']=['real','certain']
            if time[2]=='up':
                for x in time[0]:
                    if not dic[ord(x)]['isreal']:
                        if dic[ord(x)]['info'][0]=='unknown':
                            dic[ord(x)]['info'][0]='heavy'
                        if dic[ord(x)]['info'][0]=='heavy':
                            dic[ord(x)]['info'][1]='certain'
                        if dic[ord(x)]['info'][0]=='light':
                            dic[ord(x)]['isreal']=True
                            dic[ord(x)]['info']=['real','certain']
                for x in time[1]:
                    if not dic[ord(x)]['isreal']:
                        if dic[ord(x)]['info'][0]=='unknown':
                            dic[ord(x)]['info'][0]='light'
                        if dic[ord(x)]['info'][0]=='heavy':
                            dic[ord(x)]['isreal']=True
                            dic[ord(x)]['info']=['real','certain']
                        if dic[ord(x)]['info'][0]=='light':
                            dic[ord(x)]['info'][1]='certain'
            if time[2]=='down':
                for x in time[0]:
                    if not dic[ord(x)]['isreal']:
                        if dic[ord(x)]['info'][0]=='unknown':
                            dic[ord(x)]['info'][0]='light'
                        if dic[ord(x)]['info'][0]=='light':
                            dic[ord(x)]['info'][1]='certain'
                        if dic[ord(x)]['info'][0]=='heavy':
                            dic[ord(x)]['isreal']=True
                            dic[ord(x)]['info']=['real','certain']
                for x in time[1]:
                    if not dic[ord(x)]['isreal']:
                        if dic[ord(x)]['info'][0]=='unknown':
                            dic[ord(x)]['info'][0]='heavy'
                        if dic[ord(x)]['info'][0]=='light':
                            dic[ord(x)]['isreal']=True
                            dic[ord(x)]['info']=['real','certain']
                        if dic[ord(x)]['info'][0]=='heavy':
                            dic[ord(x)]['info'][1]='certain'
        for key in dic:
            if not dic[key]['isreal']:
                print('{0} is the counterfeit coin and it is {1}.'.format(chr(key),dic[key]['info'][0]))
                break
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值