练习题3.0.7

本文介绍了一个关于炉石传说新机制的数学问题,玩家需将多张手牌合并成一张,目标是最小化法力消耗。通过链表处理和遍历,找到相邻卡牌合并的最小法力值,最终输出这一过程的最小法力消耗。代码示例展示了如何实现这一算法。
摘要由CSDN通过智能技术生成
  1. 乐程棋牌pro(难度B+

(本来难度是A+,但是后面越想越简单,实在不行还能暴力解)

乐程的千千、东东和佑佑最喜欢玩炉石传说了。

(tip:炉石传说是一款卡牌游戏,其中每张卡牌都具有一个法力值)

假设炉石传说有了新机制,可以将相邻的两张手牌合并成一张新卡牌,合成的新卡牌的法力值为两张牌的法力值之和。但是,代价是,你也会消耗相同的法力。

现在,你有n张手牌,你要把所有手牌合并为一张(假设你的法力值足够多),但是要求法力值消耗尽可能小。

请你来输出这个最小值。

输入:

第一行一个正整数n,代表n张牌(n <= 10, 一般情况下最多只能有10张手牌哦)

第二行n个正整数,代表n张牌的法力值消耗(均小于10)

输出:

最小法力消耗

解释:

左上角蓝色背景的那个就是法力值

(以下简称费,1费就是1法力值消耗)

+=

比如一只1费鱼人和一个8费的垃圾,合成一张9费的大王

这个过程你就消耗9点法力值

输入样例:

5

5 6 2 3 3

输出样例:

43

思路:方便删改,可用链表处理,由题意还要遍历链表得到两个数之和的最小值然后又开始轮回,对新人极不友好系列。

代码:

#include<stdio.h>
#include<stdlib.h>
int n;
int sum=0;
typedef struct kapai
{
    int data;
    struct kapai*next;
}list;

list*create()//创建一个链表
{
    list*head = (list*)malloc(sizeof(int));
    if(head == NULL)
    {
        return NULL;
    }
    head->next = NULL;
    int a = 0;
    int num;
    list*pre = head;
    while(a<n)
    {    scanf("%d",&num);
        list*cur = (list*)malloc(sizeof(int));
        cur->data = num;
        cur->next = NULL;
        pre->next = cur;
        pre = cur;
        a++;
    }
    return head;
}
list*newlist(list*head,int time,int num)//创建一个集替换数据和删除元素为一体的函数
{
	list*he = head;
	for(int i = 0;i<time;i++)
	{
		he = he->next;
	}
	he->data = num;
	list*temp = he->next->next;
	if(temp != NULL)//判断删除后是否到尾,是尾部就指向NULL
	{
		he->next = temp;
	}
	else
	{
		he->next = NULL;
	}
}
int main()
{	scanf("%d",&n);
	list*head = create();
while(n>2)
{	int x = 0,y = 0,z = 0;
	x = head->next->data;
    y = head->next->next->data;
    list *pe=head->next->next;
    list *ne=pe->next;
    int min=x+y;
    int time=1;//记录替换元素的位置
    for(int i = 2;i<n;i++)
{
    z = pe->data+ne->data;
    if (min>z) {
        min=z;
        time=i;
    }
    pe=ne;
    ne=ne->next;
}
    sum+=min;
    newlist(head,time,min);
    n--;
}
sum = sum + head->next->data+head->next->next->data;//加上最后两个元素
	printf("sum = %d",sum);
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值