编程语言
首页 > 编程语言> > 个人笔记:算法讲座1.3——海盗分金(贪心算法)

个人笔记:算法讲座1.3——海盗分金(贪心算法)

作者:互联网

本文仅供学习参考使用,谢谢

目录:

问题描述:

Alice和Bob穿越成了加勒比的海盗。有一次海盗们发现了一个大的宝藏,金币总额M的位数比海盗们的人数还多!他们靠决斗产生了海盗的排位,并约定,无论面对的金币数量是多少,都需要在这个数目的基础上划掉位作为给下一个海盗的数目。每个海盗都希望自己拿到的金币数量最多,井假设他们都是聪明的;都知道要怎么做才能保证自己拿到最多的金币。Bob经过激烈的搏斗拿到了第4的排名,他能拿到金币的数目为N:(特别强调,所有数目里都没有0 ),问,他可以拿到多少金币?

M

N

算法思想:

涉及到一个小知识点——如何将字符串型的数据转化为int型
比如——char型 ‘4’ - ‘0’ = int型 4

凑合凑合,懒得写了。。。。
在这里插入图片描述

测试数据:

394256

231

263574982

211500

代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define maxsize 15

typedef struct {
    int L[maxsize];//按位存放 金钱数目
    int visited[maxsize];//0未读 1已读
    int num;//钱是几位数
}Money;

int readread(Money X){
    int M = 0,tmp = 0;
    for (int i=0; i<X.num; i++) {
        if (X.visited[i]==0) {
            tmp=X.L[i];
            M=M*10+tmp;
        }
    }
    return M;
}

int getnext(Money X){//删掉一位数后的最小值 这个值给下一个人
    int min=0,tmp=0;
//    printf("%d\n",X.num);
//    printf("%d\n",readread(X));
    for (int i=0; i<X.num; i++) {
        X.visited[i]=1;
        tmp=readread(X);
        if (min==0) {
            min=tmp;
        } else {
            if (tmp<min) {
                min=tmp;
            }
        }
        X.visited[i]=0;
    }
    return min;
}

Money linklink(Money X){//德国骨科接骨
    int min=getnext(X);
    int real=min,c=0;
    Money tmp=X;
    for (int i=X.num-2; i>=0; i--) {
        c=real%10;
        tmp.L[i]=c;
        real/=10;
    }
    tmp.num=X.num-1;
    return tmp;
}

int main(int argc, const char * argv[]) {
    Money name[5];// A0 B1 C2 D3 E4
    char *express=(char*)malloc(sizeof(char)*maxsize);
    gets(express);
    char *get=express;
    for (int i=0; *get; get++,i++){//给A0参数  num=实际位数
        name[0].L[i]=*get-'0';
        name[0].num=i+1;
    }
    
    for (int i=0; i<maxsize; i++)//将表内的所有visite标记为0
        for (int j=0; j<maxsize; j++)
            name[i].visited[j]=0;
        
    for (int i=1; i<=4; i++) {
        name[i]=linklink(name[i-1]);
    }
    
    int end=0;
//    end=readread(name[0]);
//    end=getnext(name[0]);
//    end=readread(linklink(name[0]));
    end=readread(name[3])-readread(name[4]);
    printf("%d\n",end);
    return 0;
}

标签:tmp,海盗,1.3,int,金币,char,算法,num,贪心
来源: https://blog.csdn.net/qq_44198589/article/details/104817805