2554 ACM 杭电 数学】的更多相关文章

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2554 中文题目,题意易懂.但是本题涉及到很强的数学思维. 思路:看了题意后:我的第一反应是除了 n=1,n=2以外全部都能满足题意,但是看了下面的范例输出,n=1309,并不符合题意,由此我推断:n是否是在满足某个条件时才成立.于是有了下面的推理过程 #include <stdio.h> int main() { int n; while(scanf("%d", &n)!=…
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2154 很简单的找规律的数学题目: 思路:因为挑完N次后都要跳回A,所以相当于挑N-1次后必须留在B C区域,又由于B与C可以看作是对称的,所以每次算的时候可以假定全部先从B跳,最后结果乘以2就好.还可以用深度遍历的思想.每次尽量跳的路线远一点. 2 2 3 2 4 6 5 10 6 22 可以发现规律: if(i%2==0) a[i]=2*a[i-1]+2; else a[i]=2*a[i-1]-2;…
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2852 题意:三种操作: 0 插入 1 删除 2 查找比a大的第k个数. 思路:看了大神都是用树状数组写的,自己也便去学了树状数组 什么是树状数组? 树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构.主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值:经过简单修改可以在log(n)的复杂度下进行范围修…
数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 36261    Accepted Submission(s): 21659 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?…
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1013 题意:求两个数的根 如: 12->3,99->9,80->8 注意题目没有限制数的大小,开始我默认 最大的数为99999,这样,第一轮相加后最大为45,还是两位数,然后4+5=9<10,只需要一轮的 取模和取商就好.但是并非如此,还是要写一个循环,能在一定条件下多次循环.例如,如果对单个字符相加后为983,循环的过程就是 983 98 3 9 8+3 0 9+8+3 20>9…
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5410 虽然是英文题目:但还是很好理解的.明显的背包问题 思路:如果你能想到把题目拆分成小问题,就会简单许多: 既然题目中的价值是:这种形式Ai × x + Bi,可以看成两部分Ai + Bi和Ai × (x-1 )的和,对前面的Ai + Bi,就是01背包问题,只有两种可能选和不选.后面的Ai × (x-1 )就是完全背包问题,每个物品可以多次被选择. 使用的先后顺序? 都可以 因为不管什么顺序,都有存…
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2002 注意,要用double 才能过,float过不了. 体积公式要加括号(优先级别)(4 * Π * r * r * r)/3 #include <stdio.h> #define PI 3.1415927 int main() { double r, v; while(~scanf("%lf", &r)) { v = (4 * PI * r * r * r)/3; pr…
题意:已知经验值,保留的忍耐度,怪的种数和最多的杀怪数.求进入下一级的最优方案. 思路:用二维费用的背包+完全背包问题 (顺序循环)方法求解 什么是二维费用的背包问题? 问题: 二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有一个可付出的最大值(背包容量).问怎样选择物品可以得到最大的价值.设这两种代价分别为代价1和代价2,第i件物品所需的两种代价分别为a[i]和b[i].两种代价可付出的最大值(两种背包容量)分别为V和U.物品的价值…
题意:装骨头的容器大小固定,有一堆骨头,已知骨头的价值和大小,在不超过容积大小的情况下,问:所装骨头的最大价值? 思路:典型的01背包问题,不需要有任何的变动. 模板: for(int j=v;j>=a[i].w;j–) //v是容积 { dp[j]=max(dp[j],dp[j-a[i].w]+a[i].val); } 注意: 1 数组dp的必须初始化(memset( dp,0,sizeof(dp))),还要够大,但是用int 定义就好了 2 输出结果后要换行(\n) 3 要勾选C++才能过…
题意: 强盗抢银行,在不被抓住的情况下,想尽量多的偷点钱.已知各个银行的金钱和被抓的概率,以及强盗能容忍的最大不被抓的概率(小于等于该概率才能不被抓),求最多能抢到钱? 并不是简单的01背包问题? 1.概率是浮点数 2.最大不被抓的概率不是简单相加,由概率论可知,要抢的几家银行同时不被抓,要相乘.P=(1-P1)(1-P2)(1-P3) (P为最大不被抓的概率,P1 P2 P3为各个银行被抓的概率) 难点: 通常的01背包模板: for(int j=v;j>=a[i].w;j–)//v是容积(拥…