n 枚の硬貨が山積みになっており、そのうちの 1 枚は偽造硬貨であり、偽造硬貨の方が重量がわずかに軽いことを除いて、外観では区別がつきません。最小数の重量比較を使用して偽造硬貨を検出するには、秤を 1 つだけ使用する必要があります。

n 枚の硬貨が山積みになっており、そのうちの 1 枚は偽造硬貨であり、偽造硬貨の方が重量がわずかに軽いことを除いて、外観では区別がつきません。最小数の重量比較を使用して偽造硬貨を検出するには、秤を 1 つだけ使用する必要があります。

n 枚のコインを同じ枚数の 2 つの山に分けます。n が偶数の場合、各山のコインの数は n/2 です。

n が奇数の場合、各山のコインの数は (n-1)/2 となり、2 つの山の外側に 1 枚のコインが残ります。

2 つのコインの山を秤に乗せて重さを比較し、一方のコインの方が軽い場合、偽物のコインは軽い方の山にあるはずです。 2 つのコインの山の重さが同じで、2 つの山の外側に残りのコインがある場合、その残りのコインは偽コインです。 2 つのコインの山の重さが同じで、2 つの山の外側にコインが残っていない場合、検索タスクは失敗し、偽のコインは見つかりません。

関数 findFalseCoin(coins,start,n) を作成し、呼び出します

「読み込んだコインリストの添字先頭からn個のコインの中から偽コインを検索する」を実装

[入力フォーム]
[出力フォーム]
[入力例]

100,100,100,99,100,100,100,100,100

【出力例】

偽コイン:3

[サンプル概要]

【等級】

# -*- coding: utf-8 -*-
"""
Created on Fri Oct 28 18:26:19 2022

@author: hp
"""

def weightcal(coins,left,right):
    sum=0
    for i in range(left,right):
        sum+=coins[i]
    
    w=sum/(max(right-left,1))
    return w
global count

def findFalseCoin(coins,start,end):
    count=0
    if(start>=end ):
        return start
    else:
        w_left=weightcal(coins,start,int( (end+start)/2)  )
        # print(w_left)
        w_right=weightcal(coins,int( (end+start)/2),end)
        # print(w_right)
        if (w_left==w_right ):
            return -1
        elif(w_left<=w_right):
            index=findFalseCoin(coins,start,int( (end+start)/2))  
        elif(w_left>=w_right):
            index=findFalseCoin(coins,int( (end+start)/2),end)
        return index
            
            
coins=list(map(eval,(input().split(','))))
n=findFalseCoin(coins,0,len(coins))
if n==-1:
    print("Fake coin is not found")
else:
    print("Fake coin:{}".format(n))



おすすめ

転載: blog.csdn.net/X131644/article/details/127576869