Buscando dinero falso

I. Descripción del problema

Hay una serie de monedas en una bolsa, que es una falsificación de dinero y la falsificación de dinero y el dinero real y exactamente lo mismo, sólo conocen la falsificación más ligero que las monedas reales. ¿Cómo encontrar Mientras que el dinero falso?

En segundo lugar, el análisis algoritmo

La estrategia de dividir y conquistar, la moneda se divide en dos planos (número impar de monedas tomadas después de que biseca el centro de la moneda), y una comparación de ambos lados de la peso de tamaño. Peso izquierda, en la parte derecha de la moneda falsa, y viceversa, y luego continuar a mirar a la mitad región falsificación de la mitad izquierda tiene una falsificación (intermedio o falsificada), hasta que el resto de dos monedas, tamaños, posición de retorno de dinero falso.


complejidad del tiempo: O (log n).

En tercer lugar, la aplicación del código

#include <stdio.h>

#define MAXNUM 30

int FalseCoin(int coin[], int low, int high)
{
    // 两个硬币的比较
    if (low + 1 == high) {
        if (coin[low] < coin[high]) {
            return low + 1;
        }
        return high + 1;
    }
    
    int sum1 = 0, sum2 = 0, sum3 = 0;
    int mid = (low + high) >> 1;
    int i;
    
    // 偶数个硬币
    if ((high - low + 1) % 2 == 0 ) {
        
        // 左半段
        for (i = low; i <= mid; i++) {
            sum1 += coin[i];
        }
        // 右半段
        for (i = mid + 1; i <= high; i++) {
            sum2 += coin[i];
        }
        
        // 左侧重,则假币在右半段
        if (sum1 > sum2) {
            return FalseCoin(coin, mid + 1, high);;
        }
        // 右侧重,则假币在左半段
        else if (sum2 > sum1){
            return FalseCoin(coin, low, mid);;
        }
        else {
            printf("没有假币。输入的硬币重量有误!");
        }
    }
    // 奇数个硬币
    else {
        // 左半段,除去中间的一个硬币
        for (i = low; i <= mid - 1; i++) {
            sum1 += coin[i];
        }
        // 右半段,除去中间的一个硬币
        for (int i = mid + 1; i <= high; i++) {
            sum2 += coin[i];
        }
        
        sum3 = coin[mid];
        
        // 左侧重,则假币在右半段
        if (sum1 > sum2) {
            return FalseCoin(coin, mid + 1, high);
        }
        // 右侧重,则假币在左半段
        else if (sum2 > sum1){
            return FalseCoin(coin, low, mid - 1);
        }
        else {
            // 中间的是假币
            if (coin[mid] != coin[low]) {
                return mid + 1;
            }
            else {
                printf("没有假币。输入的硬币重量有误!");
            }
        }
    }
    return -1;
}

int main()
{
    int coin[] = { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 };

    int position = FalseCoin(coin, 0, 9);
    
    printf("假币在第 %d 个位置", position);

    return 0;
}

假币在第 4 个位置

Supongo que te gusta

Origin www.cnblogs.com/dins/p/looking-for-counterfeit.html
Recomendado
Clasificación