摘要: #include <iostream>#include <stdlib.h>#include <string.h>#include <algorithm>#define MAX 500 using namespace std; struct Line{ int start; int end; int lenth; }line[MAX]; int n, linenumber, minlenth; int father[MAX], map[MAX][MAX], mark[MAX]; int cmp(Line a, Line b) { return a 阅读全文
posted @ 2012-06-01 19:42 背着超人飞 阅读(152) 评论(0) 推荐(0)
摘要: 题目大意是要求小狗在指定的时间恰好到达D点。由于不是求最短路线,故用DFS要简单。题目难点就是剪枝了:1.记录可行的个数,如果可行点比指定的时间还短,那么是肯定到不了的,可以剪去。2.奇偶剪枝,具体原理见链接:http://blog.csdn.net/chyshnu/article/details/6171758AC code:View Code 1 #include <iostream> 2 #include <math.h> 3 using namespace std; 4 int ln, col, time; 5 int sx, sy, ex, ey, ok, a 阅读全文
posted @ 2012-04-30 11:39 背着超人飞 阅读(293) 评论(0) 推荐(0)
摘要: 设S(x)表示x的因子和。则题目求为:S(2004^X)mod 29因子和S是积性函数,即满足性质1。性质1 :如果 gcd(a,b)=1 则 S(a*b)= S(a)*S(b)2004^X=4^X * 3^X *167^XS(2004^X)=S(2^(2X)) * S(3^X) * S(167^X)性质2 :如果 p 是素数 则 S(p^X)=1+p+p^2+...+p^X = (p^(X+1)-1)/(p-1)因此:S(2004^X)=(2^(2X+1)-1) * (3^(X+1)-1)/2 * (167^(X+1)-1)/166167%29 == 22S(2004^X)=(2^(2X+1 阅读全文
posted @ 2012-04-24 17:44 背着超人飞 阅读(327) 评论(0) 推荐(0)
摘要: 题目大意是求出N^N的最高位整数。设M = N ^ N, 则对等式两边同时求lg得, M = 10^(N*lgN),由于10的整数次方的最高位恒为一,故对M的最高位不产生影响,于是对M的最高位产生影响的只有10^(N*lgN的小数部分)。由此分析过后,我们只需要求出N*lgN的小数部分a然后求10^a的整数部分即为M的最高位整数。AC code:View Code 1 #include <iostream> 2 #include <math.h> 3 __int64 n; 4 double temp; 5 int cas; 6 using namespace std; 阅读全文
posted @ 2012-04-24 17:19 背着超人飞 阅读(146) 评论(0) 推荐(0)
摘要: 这一题是比较基础的数论题了,求N个数的最小公倍数,思路就是先求出两个数的最小公倍数,然后再用这个最小公倍数与下一个数求最小公倍数,则得三个数的最小公倍数,然后再用这三个数的最小公倍数与第四个数求最小公倍数,得这四个数的最小公倍数……如此递推,就OK了。不过要注意算最小公倍数的时候小心数据溢出!AC code:View Code 1 #include <iostream> 2 using namespace std; 3 int n, m; 4 int arr[1000]; 5 6 int gcd(int a, int b) //求出最大公约数 7 { 8 if(b) 9 ... 阅读全文
posted @ 2012-04-24 16:12 背着超人飞 阅读(229) 评论(0) 推荐(0)
摘要: 很好的最小生成树的模板题,由于用邻接矩阵存储的,故用prim算法比较方便。AC code:prim 1 #include <iostream> 2 using namespace std; 3 int n, q, sum; 4 const int MAX = 101; 5 const int INF = 100000; 6 int map[MAX][MAX], vis[MAX], dis[MAX]; 7 8 void init() 9 {10 int i, j, tx, ty;11 for(i = 1; i <= n; i++){12 for(j = 1; j... 阅读全文
posted @ 2012-04-20 11:17 背着超人飞 阅读(160) 评论(0) 推荐(0)
摘要: 这一题是比较水的最小生成树的题,作为模板题比较好,下面给出了prim算法跟kruskal算法的源代码。AC code:kruskal 1 //kruskal 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 const int MAX = 30; 6 int father[MAX]; 7 int n, sum; 8 int roadNumber; 9 struct ROAD{10 int s, e, v;11 }road[MAX * MAX];12 13 14 void init( 阅读全文
posted @ 2012-04-19 19:54 背着超人飞 阅读(152) 评论(0) 推荐(0)
摘要: 这一题是一道比较好的最短路的变型题,大致思路是求得本身到本身的最短路,注意这一题路与路是相乘的关系,用floy的算法即可。AC code:View Code 1 #include <iostream> 2 #include <string> 3 #include <map> 4 #define INF 10000 5 using namespace std; 6 7 int n, m; //货币种类与兑换方式 8 9 map<string, int> v; //利用c++提供的模板库来为数据读入带来方便10 11 double dis[100][ 阅读全文
posted @ 2012-04-13 20:17 背着超人飞 阅读(212) 评论(0) 推荐(0)
摘要: 这一题综合了DFS和DP,很好的一道题。dp[i][j]表示以第i行第j列个网格为起点所能得到的最大值,需要注意的是一次最多走k步必须在一条直线上,这个只需要在普通的深搜上加一层循环表示从1步到k步,状态转移就是dp[i][j] = max{dp[i + d1*c][j + d2*c], 1=< c <= k} + map[i][j]。AC code:View Code 1 #include<iostream> 2 using namespace std; 3 4 int a[101][101]; 5 int dp[101][101]; //dp[i][j]表示从位置( 阅读全文
posted @ 2012-03-28 18:56 背着超人飞 阅读(297) 评论(2) 推荐(0)
摘要: 初看起来貌似没什么思路,后来慢慢发现这题原来就是数塔问题的变形啊,还是用dp做,只不过将时间看作是行,将位置看做是列。状态转移方程为:f[i][j] = get_max(f[i + 1][j], f[i + 1][j + 1], f[i + 1][j - 1]) + a[i][j].由于位置有0-10共11个,所以在记录数据的时候记成1-11比较方便,防止数组越界。AC code:View Code 1 #include <iostream> 2 #define MAX 100001 3 using namespace std; 4 int Hash[MAX][20];//用二维数 阅读全文
posted @ 2012-03-27 16:27 背着超人飞 阅读(369) 评论(0) 推荐(1)