上一页 1 ··· 4 5 6 7 8 9 10 11 12 13 下一页
  2013年4月6日
摘要: 题目链接。分析:该题为多重背包。有了上一次的经验(HDU2191),这道题也就了了了。本题的思路:将cash想象成包的容量,将面值Dk想象成两个条件,即体积和价值都为Dk,那么本题就自然而然的成了求最大价值的问题。另外,这次尝试了一下其它的代码风格,因为曾经听说过,试了一下,写起来感觉不错,但找起来错就不那么容易了。纠结#define For(i, i0, n) for(int i=i0; i<=n; i++),是将它定义成i<=n呢还是i<n呢?在敲代码的过程中错认为是i<n,找了很久BUG。#include <cstdio>#include <cs 阅读全文
posted @ 2013-04-06 12:32 Still_Raining 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 转自(http://coolshell.cn/articles/4990.html)月光博客6月12日发表了《写给新手程序员的一封信》,翻译自《An open letter to those who want to start programming》,我的朋友(他在本站的id是Mailper)告诉我,他希望在酷壳上看到一篇更具操作性的文章。因为他也是喜欢编程和技术的家伙,于是,我让他把他的一些学习Python和Web编程的一些点滴总结一下。于是他给我发来了一些他的心得和经历,我在把他的心得做了不多的增改,并根据我的经历增加了“进阶”一节。这是一篇由新手和我这个老家伙根据我们的经历完成的文章。 阅读全文
posted @ 2013-04-06 11:43 Still_Raining 阅读(259) 评论(0) 推荐(0) 编辑
  2013年4月5日
摘要: 回溯法,在以前也是会的,只不过没有系统的学习,只是从题目中接触了一些。今天,系统的学习了一下,颇有感触。对于回溯,书上的模版是这样的:bool finished = FLASE; /*found all solutions yet? */backtrack(int a[], int k, data input){ int c[MAXCANDIDATES]; // candidates for next position int ncandidates; //next position candidate count int i; //counter if(i... 阅读全文
posted @ 2013-04-05 16:54 Still_Raining 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 在网上看到一篇相关的文章,感叹算法的巧妙。用O(n)复杂度搞定。异或操作(^)——(对于位操作)相同为0,相异为1.比如:1^0 = 1, 1 ^1=0这样:两个相同的数异或就为0任何数和0异或为自己(转化到位。1^0 =1,0^0=0对于2,1,3,2,1, (2^2)^(1^1)^3=3.如此就能将不成对的3找出来。异或具有交换律,所以可以按顺序计算,2^1^3^2^1=3。代码如下:#include <stdio.h>#include <string.h>#include <stdlib.h>int a[7] = {1, 2, 1, 2, 3, 5, 阅读全文
posted @ 2013-04-05 13:25 Still_Raining 阅读(230) 评论(0) 推荐(0) 编辑
  2013年4月4日
摘要: 题目链接。分析:发现只要模拟1的变化就很水了。#include <stdio.h>#include <string.h>#include <stdlib.h>int main(){ int n, t, cnt; while(scanf("%d", &n) == 1){ t = 2; cnt = 1; while(t != 1){ if(t <= n) t *= 2; else t=(t-n-1)*2+1; cnt++; } printf("%d\n... 阅读全文
posted @ 2013-04-04 22:39 Still_Raining 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 题目链接。分析:很简单,只是用到了一个模运算的公式。xy mod n = (x mod n)y mod n递归调用函数就OK了。注意:int 是存不了的。看n很小,没注意,用int WA了很多次。因为65000^2=4225000000,很大哦。所以可以用unsigned 或者是 long之类的#include <stdio.h>#include <stdlib.h>long is_prime(long n){ int i; for(i=2; i*i<=n; i++){ if(n % i == 0) break; } if(i*i<=n) return 0. 阅读全文
posted @ 2013-04-04 14:49 Still_Raining 阅读(260) 评论(0) 推荐(0) 编辑
  2013年4月3日
摘要: 题目链接。分析:一直在看多重背包,一开始做了几个,几乎全部TLE。原来是要用二进制优化,学习了一下(详情见本博客)。第一种做法:View Code #include <stdio.h>#include <string.h>#define MAXN 3000int n, m;int value[MAXN], weight[MAXN];int dp[150];int max(int x, int y){ return x > y ? x : y;}int main(){ int T, p, h, c, cnt, i, j; scanf("%d", 阅读全文
posted @ 2013-04-03 22:46 Still_Raining 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 转自(http://www.cnblogs.com/vongang/archive/2011/12/23/2299729.html)在背包九讲里面将多重背包转化为01背包,并且进行时间优化,有利用到一个二进制分解的思想。下面是在网上搜索之后得到的一个关于二进制分解思想的讲解和实现多重背包二进制分解思想讲解 在这之前,我空间好像转过一个背包九讲,现在我就只对 01背包和多重背包有点印象了 先说下 01 背包,有n 种不同的物品,每个物品有两个属性 size 体积,value 价值,现在给一个容量为 w 的背包,问 最多可带走多少价值的物品。 ... 阅读全文
posted @ 2013-04-03 21:28 Still_Raining 阅读(373) 评论(0) 推荐(0) 编辑
  2013年4月2日
摘要: 分析:这题很水,只是做的时候对边界没有分析正确,WA了很多次。发上来,警示自己要细心。方法1:设f(n)为第n为可以为0的排法:View Code #include <stdio.h> #include <stdlib.h> #include <string.h> int dp[100], k; int f(int n){ if(n == 1) return k; if(n == 2) return (k-1)*(k+1); else if(dp[n]) return dp[n]; else return (dp[n] = (k-1)*(... 阅读全文
posted @ 2013-04-02 21:53 Still_Raining 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 看了几天挑战编程的数论,颇有感触,尤其是欧几里得算法,特此记下笔记(毕竟书是借的)。 整除:对于整数a和b, 若存在整数k使得a = bk, 则称b整除(divides)a(用b|a来表示)。b|a也可以说成b是a的约数,或者a是b的倍数(multiple)。唯一分解定理:x能唯一的表示成它的素因数的乘积。如果两个整数的最大公约数(greatest common divisor)(也称gcd)是1,称二者是互素(relatively prime)的。Euclid算法:gcd(a,b)=gcd(b,a%b)Euclid算法的证明:1.如果b|a,则gcd(a,b)= b。因为如果b整除a,则存在 阅读全文
posted @ 2013-04-02 20:17 Still_Raining 阅读(930) 评论(0) 推荐(0) 编辑
摘要: 题目链接。分析:一开始竟然天真的按着题意来。果断TLE。然后就改了下。#include <stdio.h>int a[32800];int main(){ int T, n, i, j, cnt; scanf("%d", &T); while(T--){ scanf("%d", &n); for(i=1; i<n; i++) a[i] = 1; for(i=2; i<n; i++){ if(n % i == 0){ for(j=2; j<n; j++){ ... 阅读全文
posted @ 2013-04-02 18:49 Still_Raining 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 链接地址。分析:如果n能被a整除,那么一定存在一个b使得a*b = n。开关经两次变化相当于没有变化。那么只要看a = b的那种特殊情况就OK了。#include <stdio.h>#include <math.h>#include <stdlib.h>int main(){ unsigned n, k; while(scanf("%d", &n) == 1 && n){ k = (int)sqrt(n*1.0); if(k*k == n){ printf("yes\n"); } else pr 阅读全文
posted @ 2013-04-02 13:38 Still_Raining 阅读(130) 评论(0) 推荐(0) 编辑
  2013年4月1日
摘要: 题目链接。分析:不得不说,这是一道好题。dp[i][j],i代表前i个物品,j代表平衡度为j时的方法数。#include <stdio.h>#include <stdlib.h>#include <string.h>int dp[21][15002];int main(){ int n, g, i, j, k, t, c[21], w[21]; scanf("%d %d", &n, &g); for(i=1; i<=n; i++) scanf("%d", &c[i]); for(i=1; 阅读全文
posted @ 2013-04-01 11:29 Still_Raining 阅读(151) 评论(0) 推荐(0) 编辑
  2013年3月31日
摘要: 题目链接。分析:原来一天天数是这样简单。。#include <stdio.h>int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int is_leap(int n){ return ((n % 4 == 0 && n % 100 != 0) || (n % 400 == 0));}void pre(int n){ int y = 2013, m = 3, d = 24; while(n--){ d--; if(d == 0){ m--; ... 阅读全文
posted @ 2013-03-31 15:56 Still_Raining 阅读(175) 评论(0) 推荐(0) 编辑
  2013年3月30日
摘要: 题目链接。分析:这题是几周前比赛时没有做出来的一道。说来惭愧,比完赛,翻翻解题报告也没看懂,就把这题放下了。今天闲来没事,做了做,一遍AC。果然应了那句古话,岁月不饶人(题)啊。设dp[i][j]表示第i个阶段j能量所耗费的时间状态转移方程:dp[i][j] = min(dp[i][j], dp[i-1][j-F1]+T1) (Fast Mode)dp[i][j] = min(dp[i][j], dp[i-1][j]+T2) (Normal Mode)dp[i][j] = min(dp[i][j], dp[i-1][j+F2]+T3) (Slow Mode)AC代码如下:#in... 阅读全文
posted @ 2013-03-30 21:33 Still_Raining 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 题目链接。分析:题目一开始说了一大堆,以为没用,就没看。然后题不会做。后来把题目仔细看了一遍。。恍然大悟。这题的树好像叫二叉搜索树(表示木听过)。。逆序见树。#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct node{ char ch; struct node *left, *right;}node;void del(node *T){ if(T){ if(T->left) del(T->left); if(T->right) del(T->r 阅读全文
posted @ 2013-03-30 19:59 Still_Raining 阅读(313) 评论(0) 推荐(1) 编辑
  2013年3月29日
摘要: 题目链接。分析:对于该题,使用的是字典树。暴力。不过一开始忽略了个问题:对于第三个inserting of one arbitrary letter into the word.忽略了一种情况。那就是有字符串中含有相邻的相同字符。例如,aab,在0号插入a和1号插入a,新得到的字符串都是aaab。在输出时注意下就行了。#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct TrieNode{ int flag, order; struct TrieNode *next[27 阅读全文
posted @ 2013-03-29 23:35 Still_Raining 阅读(158) 评论(0) 推荐(0) 编辑
  2013年3月26日
摘要: 题目链接。分析:请参考本文章。AC代码(输出的顺序不唯一):#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAXN 102#define min(x, y) ((x)<(y)?(x):(y))const int INF = (1<<24);int G[MAXN][MAXN], dis[MAXN][MAXN], pre[MAXN][MAXN], path[MAXN];int n, m, min_cost, cnt;void floyd(){ int i, j, 阅读全文
posted @ 2013-03-26 15:10 Still_Raining 阅读(196) 评论(0) 推荐(0) 编辑
摘要: 1 定义:通常来说最小环是针对有向图而言从一个点出发,经过一条简单路径回到起点成为环.图的最小环就是所有环中长度最小的.2.怎样求最小环呢?1传统的解决方法(dijkstra): 任意一个环的权值,我们都可以看成两个有边相连的结点i、j的直接距离加上i、j间不包含边(边i->j)的最短路径。求最短路径我们第一个想到的就是Dijkstra算法。而Dijkstra所求的是一个点到所有点的最短距离。用Dijkstra所求的i、j的最短距离一定是i、j的直接距离(如果i,j连通),所以我们需要先将i、j的边从图中删除(若i,j不连通,则不用删除),再用Dijkstra求新图中i、j的最短距离即可 阅读全文
posted @ 2013-03-26 15:05 Still_Raining 阅读(270) 评论(0) 推荐(0) 编辑
  2013年3月24日
摘要: 题目链接。分析:这题就是01背包。dp数组开不到10000000,表示木办法,然后就用了dfs,TLE,剪了几下还是TLE。跟人学了下其它剪枝,过了。#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 35#define INF 10000010int w[MAXN];int n, m, min;int cmp(const void *a, const void *b){ return *(int *)a - *(int *)b > 0 ? -1 : 1;}void 阅读全文
posted @ 2013-03-24 10:29 Still_Raining 阅读(296) 评论(0) 推荐(0) 编辑
上一页 1 ··· 4 5 6 7 8 9 10 11 12 13 下一页