uva 10934(dp)

题意:k个水球,现在在一个n层建筑物上,水球可能在某一层层以上扔下去会破掉,现在求一个最少的次数使得用这k个水球能确定出哪一层。

思路:假设有i个小球,还可以实验j次时,第一个小球从x处扔下去,如果破了,那么可以确定答案肯定在x之下找,剩下i-1个小球和j-1次实验,可以在x之下确定出最高层数,那么x-1就是这最高层数(试想如果x-1 > 最高层数,那么中间可能有一些层数就无法确定了)所以x = f[i - 1][j - 1] + 1;

然后在考虑,如果这个小球在x位置没破,那么就往上找,这时候有i个小球,j-1次,用这些去往上确定层数为f[i][j - 1],那么往下和往上能确定的层数加起来就是总的能确定的层数

f[i][j] = f[i - 1][j - 1] + 1 + f[i - 1][j];

#include <cstdio>
#include <iostream>
#include <sstream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
#define ll long long
#define _cle(m, a) memset(m, a, sizeof(m))
#define repu(i, a, b) for(int i = a; i < b; i++)
#define repd(i, a, b) for(int i = b; i >= a; i--)
#define sfi(n) scanf("%d", &n)
#define pfi(n) printf("%d\n", n)
#define sfi2(n, m) scanf("%d%d", &n, &m)
#define pfi2(n, m) printf("%d %d\n", n, m)
#define pfi3(a, b, c) printf("%d %d %d\n", a, b, c)
#define MAXN 105
const int INF = 0x3f3f3f3f;
#define ull unsigned long long
ull dp[MAXN][65];
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
using namespace std;

typedef long long int64;

int64 f[110][65];

inline void init() {
    memset(f, 0, sizeof(f));
    for (int i = 1; i < 64; ++i) {
        for (int j = 1; j < 64; ++j) {
            f[i][j] = f[i][j-1] + f[i-1][j-1] + 1;
        }
    }
}
int main(){

    init();
    int k;
    int64 n;

    while (~scanf("%d%lld", &k, &n) && k) {
        k = min(63, k);
        bool ok = false;
        for (int i = 0; i <= 63; ++i) {
            if (f[k][i] >= n) {
                printf("%d\n", i);
                ok = true;
                break;
            }
        }
        if (!ok) puts("More than 63 trials needed.");
    }
    return 0;
}

时间: 2024-12-07 22:09:54

uva 10934(dp)的相关文章

Dropping water balloons UVA - 10934(递推)

Dropping water balloons UVA - 10934 题意: 可以说是很懵比了... 和上一个题有相似之处,就是我们需要判断的结果是一个未知量.如本题气球的硬度,可能为1,2,3,------,n,n+1. 最坏情况需要测到n楼才知道结果.题目要求确定气球硬度,我们要考虑所有情况.[即我们要求的是最少测几次才可以测到n楼.] 用d[i][j]表示i个气球j次试验最多测到d[i][j]楼(即运气足够好的情况下可以测到几层楼)[这也是题目要求的,最少几次!!] (上面这两条红字放一

Uva 147-Dollars(DP)

题目链接:点击打开链接 换硬币问题.不过存在分,所以是小数输入,一开始因为精度问题wa一发.而且..计数用long long.. #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <string> #include <cctype> #include <vector> #include <cs

UVA 12063(dp记忆化)

UVA - 12063 Zeros and Ones Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Binary numbers and their pattern of bits are always very interesting to computer programmers. In this problem you need to c

UVA 1424-Salesmen(DP)

题目大意:给出一个连通图和一个序列,求改变尽量少的序列中的元素,使得相邻两个元素相同或在图中相邻. a[i][j]=1表示i和j相邻,a[i][j]=0表示i和j不相邻.b[i]表示序列中第i个数. 用d[i][j]表示前i个数且第i个数为元素j时的最少改变数量,由d[i-1][u]推来.其中j和u相同或相邻. 状态转移方程:d[i][j]=min { d[i-1][u]+k }(a[u][j]=1,u==b[i]时k=0,u!=b[i]时k=1) #include<stdio.h> #inc

UVA 1631-Locker(DP)

题目大意:给出两串长度为n(n<=1000)的只含数字的串,每次操作可以将连续的1到3个数字模10加1或模10减1(即9+1=0,0-1=9),求源串最少多少步能变成目标串. 首先假定,对于任意操作,把最后一个操作数当做操作的操作数.比如000一步变为111把操作数看成第3个数. 预处理出数组cost,cost[i][j]表示在只有最后一个数字是操作数的情况下,从数字i变到数字j要的最少步数(i,j<1000).例如111变为220为3,只能操作最后一个数,所以111-->222->

UVA 1632-Alibaba(DP)

题目大意:在一条直线上有n(n<=10000)个点有宝藏,每个点的坐标都是整数,每个宝藏在某个时间到之后都会消失,可以在任何一个点出发,移动一个单位需要一个单位的时间,问最少需要多少时间拿完所有宝藏,如果不能拿完所有的输出No solution.输入按照坐标递增顺序. a[i]表示第i个宝藏的位置,b[i]表示消失的时间. 首先注意到对于任意区间(i,j),拿完所有宝藏之后必然在i或j两者之一.所以用d[i][j][0]表示拿完第i个到第j个之间的所有宝藏,且最后位于i,用d[i][j][1]表

UVA 1452-Jump(DP)

题目大意:约瑟夫问题,求最后被删除的三个人的编号,编号从1开始. 用d[i][0]表示倒数第三个被删除的,d[i][1]表示倒数第二个,d[i][2]表示最后一个.考虑删除掉第一个人以后从d[i-1][0-2]递推而来.对d[i-1][0-2]重新编号以完成递推(实际上d[i][0-2]可以看成对于第一个人的相对偏移位置). 状态转移方程: d[i][0]=(d[i-1][0]+(m-1)%i)%i+1 d[i][1]=(d[i-1][1]+(m-1)%i)%i+1 d[i][2]=(d[i-1

UVA 10497 - Sweet Child Makes Trouble(DP+高精度)

题目链接:10497 - Sweet Child Makes Trouble 题意:n个物品,原来物品属于一个地方,现在要把物品重新放回去,问能放几种使得每个物品都与原来位置不同 思路:递推,一开始随便搞了个二维状态,dp[i][j]表示i个物品,有j个位置不同,那么dp[n][n]就是答案,递推式为: dp[i][j] = 1 (j == 0) dp[i][j] = (j - 1) * dp[i - 1][j - 1] + dp[i - 1][j] + (i - j + 1) * dp[i -

UVA 10641 - Barisal Stadium(DP + 几何)

题目链接:10641 - Barisal Stadium 题意:逆时针给定n个点,在给m个灯,每个灯有一个花费,要求最小花费使得所有边能被灯照到 思路:用向量叉积判断向量的顺逆时针关系,从而预处理出每个灯能照到的边,然后由于n个点是环的,所以可以直接扩大两倍,dp时候去枚举起点即可 状态为dp[i]表示现在照到i条边之前的边全部照亮需要的最小花费 代码: #include <stdio.h> #include <string.h> const double eps = 1e-6;