USTC OJ — 1011 Problem of Deck(组合数学,递推关系)

1. 题目描述

根据题意,我们可以知道:

在桌子边上放一个尺子(长度为L),为了保持其不掉落,伸出桌面边缘最大长度为1/2L。

在上面的基础上,再累加一个尺子,为了保持其不掉落,伸出下面尺子的边缘最大长度为1/4L。

在累加一个尺子,为了保持其不掉落,伸出下面尺子的边缘最大长度为1/6L。

依次下去。。。

2. 算法设计

由上面的描述,我们可以得到递推关系

累加了n把尺子时,延伸出桌子边缘的长度为

length(0) = 0

length(n) = length(n-1) + 1/(2n) , n ≥ 1.

3. AC Code

 1 #include <stdio.h>
 2 #define N 100000
 3 double table[N]; // table[i] i张cards的时候,extend的长度
 4
 5 void print(int n);
 6
 7 int main()
 8 {
 9     int i, n;
10     // take table
11     table[0] = 0;
12     for ( i = 1; i < N; i++ )
13     {
14         table[i] = table[i-1] + 1.0 / (2*i);
15     }
16
17     printf("# Cards  Overhang\n");
18     while ( EOF != scanf("%d", &n) )
19     {
20         print(n);
21     }
22 }
23
24 void print(int n)
25 {
26     printf("%5d     %.3lf\n", n, table[n]);
27 }

时间: 2024-11-09 03:32:20

USTC OJ — 1011 Problem of Deck(组合数学,递推关系)的相关文章

USTC OJ — 1003 Fibonacci Numbers(组合数学, 简单题)

1. 题目描述 Fibonacci数列定义为: A0 = 0, A1 = 1; An = An-1 + An-2, if n >= 2. 问题:输入一个n( 0 ≤ n ≤ 40 ),计算An. 2. 算法设计 直接利用公式计算即可,时间复杂度O(N),由于数据规模很小,可以选择 先打表,然后对每一个测试数据n,直接输出An: 或者分别对每一个n,计算An. 3. AC Code 1 #include <stdio.h> 2 #define N 41 3 int f[N]; 4 void

USTC OJ — 1008 Word Amalgamation(组合数学,全排列)

1. 题目描述 题目的输入数据有两部分,前一部分是dictionary,后一部分是待查的单词集合. 对于每一个待查单词word1,我们需要从dictionary中查找对应的词汇word2.查找规则是:word1和word2组成的字母集合(这里是多重集合)相等. 2. 算法设计 对于每一个待查单词word1,用它对应的字母集合构造全排列. 对于全排列中的每一个排列,去查找是否存在于dictionary中.如果存在,就保存下来.如果不存在,直接输出“NOT A VALID WORD”. 如果在dic

Light OJ 1102 Problem Makes Problem 组合数

#include <iostream> #include <string> #include <map> #include <vector> #include<algorithm> using namespace std; typedef pair<string,int>PAIR; bool cmp_by_value(const PAIR& p,const PAIR &a) { return p.second<a

Light oj 1095 - Arrange the Numbers (组合数学+递推)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1095 题意: 给你包含1~n的排列,初始位置1,2,3...,n,问你刚好固定前m个数中的k个数的位置,问你有多少中排列方案.(比如5 3 2有1 4 3 2 5这种方案,1和3固定了) 思路: 前m个取k个就是C(m, k)个方案.然后就是类似错排的思想,设dp[i]为i个数在初始位置各不相同.其中的组合数用逆元算出. ans = dp[m - k] * C(n - m,

(light oj 1102) Problem Makes Problem (组合数 + 乘法逆元)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1102 As I am fond of making easier problems, I discovered a problem. Actually, the problem is 'how can you make n by adding k non-negative integers?' I think a small example will make things clea

Light OJ 1011

题意: (好难看) 给你 N 个 男的, 女的, 男的选女票, 题目给出矩阵, Mp[i][j] 表示 第 i 个男的选 第 J 个女的优先值 选了 J 之后的就不能选 J 了: 求所有狗男女的最大优先值 思路: Dp + 状态 压缩 #include<bits/stdc++.h> using namespace std; const int maxn = 1<<16; int Mp[20][20]; int Dp[20][maxn + 131]; int main() { int

HDU1294 Rooted Trees Problem(整数划分 组合数学 DP)

讲解见http://www.cnblogs.com/IMGavin/p/5621370.html, 4 可重组合 dfs枚举子树的节点个数,相乘再累加 1 #include<iostream>  2 #include<cstdio>  3 #include<cstring>  4 #include<cstdlib>  5 #include<algorithm>  6 using namespace std;  7 typedef long lon

USTC OJ — 1004 Block world (数据结构stack,简单题)

1. 题目描述 本题描述了一个“机器人”的世界,初始状态如下所示: 现实世界中,机器人没有自主思想,只能接受指令去完成工作.类似地,题目中定义了下面的几种指令: 问题:给定一系列操作指令,计算出“机器人”在完成这些指令之后,“机器人”世界(即Block world)的状态.注意:指令操作结束是使用quit指令来完成. 2. 算法设计 问题很简单,显然需要用stack数据结构表示. 然后只需要把上面的指令描述清楚,模拟各个指令的操作设计出5个API来完成这5个指令即可. 简单地把上面五种机器人指令

USTC OJ — 1005 Booklet Printing(找规律,简单题)

1. 题目描述 本题的描述比较凌乱,不过题目给出的测试数据比较好,可以推测出题目的意思. 下面是题目给出的测试数据: 2. 算法设计 每一张纸可以印4页,从第一张纸开始往后遍历,分别设置每张纸上需要印制的页码即可. 以第二组测试数据为例: 共需要印刷的页数n = 14,那需要的纸张数sheet_num = n / 4 + 1 = 4. sheet_num = 4时,共可以印4*4 = 16页.实际只需要印14页,那就有两页空着,需要印上Black. 观察相邻的两页纸上印刷的页码,如下: 页码从前