- 乐程棋牌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;
}