博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ZPG TEST 105] 扑克游戏【Huffman】
阅读量:4599 次
发布时间:2019-06-09

本文共 1628 字,大约阅读时间需要 5 分钟。

扑克游戏

(poker)

题目描述:

有一棵无穷大的满二叉树,根为star,其余所有点的权值为点到根的距离,如图:

现在你有一些扑克牌,点数从1到13,你要把这些扑克牌全部放到这个树上:

  1. 当你把点数为i的扑克牌放在权值为j的点上,那么你会得到i*j的分数。
  2. 当你把一个扑克牌放在一个节点上,那么你就不能把别的扑克牌放在这个节点以及这个节点的子树上。

你的目标是最小化你的得分。

输入:

    文件名为 poker.in

         输入第一行为一个数字N,表示你有的扑克牌数;

接下来一行N个数字,数字在1到13之间。

输出:

文件名为 poker.out

         一个数字,最小得分。

样例输入:

3

5 10 13

样例输出:

43

 

样例说明:

 

数据范围:
          30%数据 N<=100

100%数据满足1<=N<=10000.

 

 

就这破(水)题暴了我好久时间,其实是一道水题。想到这棵树的每个节点只可能有0个或者2个儿子(这很显然)。这不就是huffman的的特点吗!然而吾并没有往这上面想,其实这道题就是合并果子!想象题目中输入数据的第二行给出的就是N个字符的出现频率,这特么就是huffman!唉,破烂题目毁我一生!

 

#include 
#include
const int maxn = 10005;int n, a[maxn], b[maxn], head1, head2, tail2, ans, t, flag;int main(void) { freopen("poker.in", "r", stdin); freopen("poker.out", "w", stdout); scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d", a + i); } std::sort(a, a + n); for (int i = 1; i < n; ++i) { t = 2147483647; flag = -1; if (head1 + 1 < n && t > a[head1] + a[head1 + 1]) { t = a[head1] + a[head1 + 1]; flag = 0; } if (head1 < n && head2 < tail2 && t > a[head1] + b[head2]) { t = a[head1] + b[head2]; flag = 1; } if (head2 + 1 < tail2 && t > b[head2] + b[head2 + 1]) { t = b[head2] + b[head2 + 1]; flag = 2; } if (!flag) { head1 += 2; } else if (flag == 1) { ++head1; ++head2; } else { head2 += 2; } b[tail2++] = t; ans += t; } printf("%d\n", ans); return 0;}

 

转载于:https://www.cnblogs.com/ciao-sora/p/5969320.html

你可能感兴趣的文章
利用CGLib实现动态代理实现Spring的AOP
查看>>
面试之SQL(1)--选出选课数量>=2的学号
查看>>
IIS处理并发请求时出现的问题
查看>>
数学作业
查看>>
使用pycharm开发web——django2.1.5(二)创建一个app并做一些配置
查看>>
[ZPG TEST 105] 扑克游戏【Huffman】
查看>>
_bzoj2005 [Noi2010]能量采集
查看>>
pat 团体天梯赛 L3-010. 是否完全二叉搜索树
查看>>
烟草MES系统介绍-序
查看>>
优先队列小结
查看>>
线程安全与可重入函数之间的区别与联系
查看>>
bat批处理中如何获取前一天日期
查看>>
{Nodejs} request URL 中文乱码
查看>>
异常及日志使用与项目打包
查看>>
努力,时间,坚持,自律
查看>>
真三 bug PT的凤凰
查看>>
???动态SQL
查看>>
js错误处理与调试理论和办法
查看>>
Binding.StringFormat不起作用的原理和解决
查看>>
css hack兼容写法
查看>>