抛棋子抛鸡蛋抛围棋典型题解
来源:互联网 发布:淘宝商品分类 编辑:程序博客网 时间:2024/04/29 22:23
问题1 :
题目:一种石头,在某一高度扔下就会碎,在这个高度以下不会碎,高度以上一定碎。现在有4个石头,1000层的楼房,需要测定这个石头破碎的高度。求最少多少次一定可以测出来。
题目:一种石头,在某一高度扔下就会碎,在这个高度以下不会碎,高度以上一定碎。现在有4个石头,1000层的楼房,需要测定这个石头破碎的高度。求最少多少次一定可以测出来。
问题2 :
题目:一个100层的大厦,你手中有两个相同的鸡蛋(玻璃球或围棋)。从这个大厦的某一层扔下鸡蛋((玻璃球或围棋))就会碎,用你手中的这两个鸡蛋(玻璃球或围棋),找出一个最优的策略,来得知那个临界层面。
问题3:
题目:有一个100层高的大厦,你手中有两个相同的玻璃围棋子。从这个大厦的某一层扔下围棋子就会碎,用你手中的这两个玻璃围棋子,找出一个最优的策略,来得知那个临界层面。
这种问题 一般让人想到用二分的解法,但是二分法的最大深度为logn,那么石头有限如何选择合适的抛石头层数则是很重要的。
网上目前主流解法就是动态规划,因此我好好学习学习相关知识。我看了解法 觉得 动态规划解决 这种问题 最优解 就是处理 哪里扔可以保证扔的次数最少。
楼层 有n个,球有K 个
F(n,k) = min{max{f(r,k-1),f(r+1,k)}+1, 1=<r<=n}
这个的意思 就是F(n,k)的含义 n层楼 k个球最少次数确定临界层
其实 r就是用来表示 我从哪一层开始探测,当然需要考虑 从第一层到第n层中的某一个来开始处理。
情况 假设从第r层 开始扔
如果 球碎了 ,那么 一定在1 - r层必有一层为临界 剩k-1个球
如果 球未碎,那么一定 在r+1-n层必有一层为临界 剩 k个球
当然 在计算F(n,k)是 我需要按最坏情况考虑 ,如果 在 1-r-1层扔的次数 多于 r-n层 我需要记录的次数 当然为f(r,k-1)反之亦然。
好了基于这个思想来code
第一题:
#include "stdio.h"#define MAX 1024#define MIN 0x7fffffff#define NUM 10int f[MAX][NUM];void find(int n,int k){int r;int i;int j;int temp;int left;int right;int min ;for(i=2;i<=k;i++){for(j=2;j<=n;j++){min=MIN;for(r=1;r<=j;r++){left = f[r][i-1];right = f[j-r][i];temp=(left>right?left:right)+1;if(temp<min){min =temp;}}f[j][i]=min;}}}int main(){int n;int k;int i=0;scanf("%d",&k);scanf("%d",&n);for(i=1;i<=n;i++)f[i][1]=i-1; /*1个球检测i层 最少 i-1次*/for(i=1;i<=k;i++)f[1][i]=0; /*楼只有一层 不需检查*/find(n,k);printf("%d\n",f[n][k]);return 0;}
题目1 答案为 13
题目2 答案为14
题目3 答案为14
- 抛棋子抛鸡蛋抛围棋典型题解
- 抛鸡蛋(玻璃球或围棋)
- 抛鸡蛋(玻璃球或围棋)-优化版
- 抛玻璃棋子的问题
- 棋盘 围棋? 黑白棋子? 我忘记了
- 动态规划解抛鸡蛋(玻璃球)问题
- Google算法题:扔鸡蛋/扔棋子
- 百练3723:围棋题解
- 动态规划求解抛鸡蛋问题(Google某年面试题)
- 存储器相关典型题解
- bzoj 3519: [Zjoi2014] 消棋子 题解
- 围棋
- 围棋
- 围棋
- 围棋
- 围棋
- 围棋
- 围棋
- C程序设计伴侣 : 帮你更好地理解谭浩强老师的那本书以及更多
- 如何做好软件需求捕获
- Ubuntu 11.04 安装 Oracle XE 11.2
- 一些peter-bochs的的視訊教程
- oracle 多个字段 去重
- 抛棋子抛鸡蛋抛围棋典型题解
- exec与sp_executesql语法的区别详解(转)
- BB10 Cascades Hello World样例分析
- [置顶] hibernate自身多对多关联
- [置顶] img标签在firefox下图片不显示
- [置顶] struts2 action 接收中文乱码
- [置顶] spring aop 切入aciton
- [置顶] jQuery发送ajax请求,一次点击重复提交
- Ubuntu下安装Oracle Instant Client