上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 14 下一页
摘要: 这算什么算法呢?? 模拟吧,反正很简单,代码:#include <stdio.h>#include <stdlib.h>int num[2000] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};int ans;int main(int argc, char **argv){ int i, j; int n; scanf("%d", &n); n -= 4; for(i = 10; i < 2000; i++){ num[i] = num[i / 10] + num[i % 10]; } for(i = 0; i &l 阅读全文
posted @ 2011-07-30 19:59 zqynux 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 双线程动态规划,f[i][j][k]代表移动i次,两个点的横坐标分别是j, k,转移方程如下: f[i][j][k] = max(f[i - 1][j][k],f[i - 1][j][k - 1],f[i - 1][j - 1][k],f[i - 1][j - 1][k - 1]) 代码如下:#include <stdio.h>#include <stdlib.h>int map[11][11];int f[20][11][11];#define max(a, b) ((a)>(b)?(a):(b))int main(int argc, char **argv){ 阅读全文
posted @ 2011-07-30 19:42 zqynux 阅读(1329) 评论(0) 推荐(1) 编辑
摘要: 最开始写的伪代码如下:寻找当前油量能到达的最便宜的加油站 如果找到了,那就开过去加油。 如果找不到, 那就寻找最近的比本站便宜的站点 找到的话就加油刚好开过去 找不到的话就寻找次优站点,充满油开过去 如果找不到任何站点,那就输出No Solution 但是发现可以优化结构,就又写了一个:寻找距离当前站最近的比当前站便宜的站点 如果找到了,油量够就直接开过去,油量不够就冲到刚好可以开过去 如果找不到,就到前面找一个充满油量能到得了的最便宜的站点,充满油开过去。 如果加满油找不到任何站点,那就输出No Solution 代码如下:#include <stdio.h>#include & 阅读全文
posted @ 2011-07-30 12:41 zqynux 阅读(2163) 评论(0) 推荐(1) 编辑
摘要: 纯模拟吧~~细节不阐述了,代码如下:#include <stdio.h>#include <ctype.h>#include <string.h>#include <stdlib.h>#define MAX 100001int str[MAX];int tmp[MAX];int len;int k;int huiwen(void){ int i = 0, j = len - 1; while(i < j){ if(str[MAX - 1 - i] != str[MAX - 1 - j]){ return 0; } i++, j--; } r 阅读全文
posted @ 2011-07-29 15:46 zqynux 阅读(1243) 评论(0) 推荐(0) 编辑
摘要: 暴力搜就可以了,枚举每一个点放进第j个矩形里面,然后保存最小值就可以了,代码如下:#include <stdio.h>#include <stdlib.h>#define oo 0xFFFFFFFstruct dot{ int x, y;}dots[50];struct ret{ struct dot l, r;}rec[4];int n, k;int ans = oo;int check_(int i, int j){ if(rec[i].l.x == oo || rec[i].l.y == oo || rec[i].r.x == -oo || rec[i].r.y 阅读全文
posted @ 2011-07-29 09:49 zqynux 阅读(955) 评论(0) 推荐(0) 编辑
摘要: 挺好的题目,以后记住,当出现初始状态和目标状态求最短路径的时候就用双向DFS,速度快很多!!! 双向BFS的资料:http://www.cnblogs.com/yylogo/archive/2011/07/25/double-bfs.html 代码如下:#include <stdio.h>#include <string.h>#include <stdlib.h>struct { char str[401]; int sep;}q1[20000], q2[20000];int h1, r1, h2, r2;char s1[6][21], s2[6][21]; 阅读全文
posted @ 2011-07-27 20:13 zqynux 阅读(1793) 评论(3) 推荐(0) 编辑
摘要: 这题总算是弄好了,大致思路还是简单,我不贴思路了,贴另一个收获,如下,看下面两段代码:#include <stdio.h>#include <stdlib.h>int map[300][300];int count[300];int time[300];int ans, tot;int n, p;void maketree(int k){ int i; int j, l; for(i = 0; i < count[k]; i++){ j = map[k][i]; for(l = 0; l < count[j]; l++){ if(map[j][l] == k 阅读全文
posted @ 2011-07-25 21:02 zqynux 阅读(992) 评论(0) 推荐(0) 编辑
摘要: 转自:http://www.cppblog.com/Yuan/archive/2011/02/23/140553.aspx如果目标也已知的话,用双向BFS能很大提高速度单向时,是b^len的扩展。双向的话,2*b^(len/2) 快了很多,特别是分支因子b较大时至于实现上,网上有些做法是用两个队列,交替节点搜索×,如下面的伪代码:while(!empty()){扩展正向一个节点遇到反向已经扩展的return扩展反向一个节点遇到正向已经扩展的return}但这种做法是有问题的,如下面的图:求S-T的最短路,交替节点搜索(一次正向节点,一次反向节点)时Step 1 : S –> 1 阅读全文
posted @ 2011-07-25 13:14 zqynux 阅读(903) 评论(0) 推荐(0) 编辑
摘要: 本题就是数学题,比较繁琐的是误差和特殊情况。假设一个球i,它掉落到车顶的时间为t1,掉落到地上的时间为t2,则如果掉落到车顶时车的后排已经经过该点,或掉落到地上时车的前排还没有到达该点,则该点不会被接受。于是有:i<=s+l-vt1,i>=s-vt2综合考虑1e-5的误差,我们得出i的区间:[s-vt2-e,s+l-vt1+e]∩[0,n-1],而接受的球数就是该区间内的整数个数。 代码如下(其实我觉得这个代码有不好的地方,但是能AC。。数据不强大。。):#include <math.h>#include <stdio.h>#include <stdl 阅读全文
posted @ 2011-07-25 10:31 zqynux 阅读(808) 评论(0) 推荐(1) 编辑
摘要: 好题!非常好的贪心题,引用别人的题解吧: 开始容易想到在所有的牌中找到最多的一堆,然后向小的牌堆上移动,一直到所有的牌都相等,但关键是不知道往哪个方向上移动才能达到移动次数最少。 设a[i]为第i堆纸牌的张数(0<=i<=n),ave为均分后每堆纸牌的张数,ans为最小移到次数。 我们按照由左而右的顺序移动纸牌。若第i堆纸牌的张数a[i]超出平均值,则移动一次(ans+1),将超出部分留给下一堆,既第i+1堆纸牌的张数增加a[i]-ave;若第i堆纸牌的张数a[i]少于平均值,则移动一次(ans+1),由下一堆补充不足部分,既第i+1堆纸牌的张数减少ave-a[i]; 问题是,在从 阅读全文
posted @ 2011-07-24 20:33 zqynux 阅读(472) 评论(0) 推荐(0) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 14 下一页