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

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

目录:

问题描述:

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

输入:

M

输出:

N

算法思想:

涉及到一个小知识点——如何将字符串型的数据转化为int型:

比如——char型 ‘4’ - ‘0’ = int型 4

凑合凑合,懒得写了。。。。

2870dcbd4acdb0adc2a0e1be187a8de3.png

测试数据:

数据1:

394256

结果1:

231

数据2:

263574982

结果2:

211500

代码:

#include

#include

#include

#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

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.visited[i]=1;

tmp=readread(X);

if (min==0) {

min=tmp;

} else {

if (tmp

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

for (int j=0; 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值