摘要: x 、y、n都是正整数,并且 显然,x >= n , y >= n ,现在假设 y = n +k (k为正整数) ,那么带入公式,可以得出 x = (n*(n+k))/k = n*n/k + n; 由于x 是正整数,现在的关键问题就是要求出 n*n/ k 有多少组正整数的可能,显然,所要求的就是 n*n 因子的个数// 问题已经非常接近答案了,但是最后还有一个问题,n<= 10^9 , 那么n*n <= 10^18 ,对于一个这么大的数字怎样才能求出它因子的个数呢?命题1: 一个正整数 n 可以用素因子唯一表示为 p1^r1 * p2^r2 * ... pk^rk (其 阅读全文
posted @ 2011-08-16 11:29 wutaoKeen 阅读(383) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#include<stdlib.h>int main(){ double k,l,s,w; while( scanf( "%lf%lf%lf%lf",&k,&l,&s,&w ),k||l||s||w ) { if( l>=s )//当绳子大于桥的高度就只要判断势能转化成动能 { if(s>(100/19.62)) printf( "Killed by the impact.\n" ); else printf( "James Bond surv 阅读全文
posted @ 2011-08-15 22:07 wutaoKeen 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 该题只要注意前面几个精度就可以。#include<stdio.h>#include<stdlib.h>int main(){ int n=1,a[10]={1}; while( n<10 ) { a[n]=a[n-1]*n; n++; } printf( "n e\n" ); printf( "- -----------\n" ); printf( "0 1\n" ); printf( "1 2\n" ); printf( "2 2.5\n" ); n=3; dou 阅读全文
posted @ 2011-08-15 19:34 wutaoKeen 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 该题是一题找规律题,当n与m都是偶数或是倍数是就存在这样的洞,方法一:#include<stdio.h>#include<stdlib.h>int main(){ int n,m,N; scanf( "%d",&N ); for( int i=1; i<=N; i++ ) { scanf( "%d%d",&n,&m ); if( n==1 || m==1) printf( "NO\n" ); else { if( (n%2==0) && (m%2==0) ) pri 阅读全文
posted @ 2011-08-15 19:10 wutaoKeen 阅读(412) 评论(2) 推荐(0) 编辑
摘要: 该题一直TLE,后来把qsort改成sort就过了,悲伤呀,该题用到DP中的分治法,先看看这题分治法的原理:<!--[if !supportLists]-->1、<!--[endif]-->问题综述最接近点对问题的提法是:给定平面上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小。实际情况下,最接近点对可能多于一对,为简单起见 ,我们只找其中的一对作为问题的解。有一个最直观的方法就是将每一点与其他n-1个点的距离算出,找出达到最小距离的两点即可。然而,这样做效率太低,我们想到用递归法来解决这个问题。2、 用递归法解决将所给的平面上n个点的集合S分 阅读全文
posted @ 2011-08-15 16:03 wutaoKeen 阅读(421) 评论(0) 推荐(0) 编辑
摘要: 首先相信你已经看过《背包九讲》。对于每一次决策后,我们都能得到一组值:F[ i, j] I 表示进行了i次决策,j表示占用了j 的体积。最终获得了F[i,j]的收益。这么考虑的话,很显然,就能得到最优子结构的性质:如果最终能得到Fmax[ n, v ] ,那对于每一组i,j 必定 F[i,j]=Fmax[i,j]。因此,在遍历树的时候,如果两种决策有相同的i,j 那我们可以取出两者中的最大值,另外一种就被无情的抛弃了-_- 。这样,对于每一组的i,j 我们可以方便的按如下方程求出:F[i,j]=max( F[i-1,j] , f[i-1][j-volume[i]] + value[i] ) 按 阅读全文
posted @ 2011-08-13 20:14 wutaoKeen 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 该题分别给出面值为1,5,10,50,100的纸币数,求出,表示一个值的最少所需的纸币数,最多所需的纸币数。先贪心出最少的情况,怎样取得最小的,我们每次取币值最大,跟价钱比较,如果价钱大于币值,我们一定用币值大的,下面取得最小的,我们因该从刚满足我们价钱的最大的币值开始取,那么我们每次下去一定取得的数目是最大的,#include<stdio.h>#include<stdlib.h>#include<string.h>int minnumber( int a[], int num[], int price, int sum[] ){ int ans=0; fo 阅读全文
posted @ 2011-08-12 16:26 wutaoKeen 阅读(642) 评论(0) 推荐(0) 编辑
摘要: 该题只是在完全背包基础之上加了一个条件,就是只能杀s个怪,那么我们就对每次记录每次在该忍耐点所杀的怪,如果所杀的怪大于所给的数目,那么我们就不更换经验值。怎样计算所剩的忍耐点,我们知道每一个忍耐点都是所杀怪所得到的经验值最大,那么我们只要对f进行遍历一遍,如果经验值大于等于所给的经验值,代表在该忍耐点已经可以获得了升级。#include<stdio.h>#include<stdlib.h>int DP( int add[],int reduce[], int n, int m, int k,int s ){ int f[124]={0},hash[124]={0},; 阅读全文
posted @ 2011-08-11 22:16 wutaoKeen 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 该题WA了几次,一直找不出错误,后来经过livs的指导,我们先拿出5元,这5元一定是买价钱最贵的菜,这样才能保证剩余的钱最少,那么我们还要做一件事就是选取最贵的菜,这两件事处理好了,就是一件简单的01背包。#include<stdio.h>#include<stdlib.h>int ZeroOnePack( int price[],int money,int n ,int pos,int max){ int f[1024]={0}; for( int i=1; i<=n; i++ ) { if( i!=pos ) for( int j=money-5 ; j> 阅读全文
posted @ 2011-08-11 19:40 wutaoKeen 阅读(460) 评论(0) 推荐(0) 编辑
摘要: 该题搞了一个晚上才A了它,刚开始一直不能出正确结果,总认为是我的二分哪里错了,修改了几个小时,还重敲了,后来才发现是矩阵建反了,该题最重要的是建立矩阵,如果矩阵建立好了,就万事顺利了,怎样建立这个矩阵了,我们来讨论一下(n>10),f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);我们来看个图:、矩阵A 矩阵B0 1 0 0 0 0 0 0 0 0 f0 f10 0 1 0 0 0 0 0 0 0 f1 f20 0 0 1 0 0 0 0 0 0 f2 f30 0 0 0 1 0 0 0 0 0 * f3 阅读全文
posted @ 2011-08-09 10:00 wutaoKeen 阅读(541) 评论(0) 推荐(0) 编辑