摘要: 就是暴力搜索,用f[i]为0为1代表是否能够构成着一种,如果能就是1不然就是0,然后代码就出来了:#include <stdio.h>#include <stdlib.h>char f[35001];int main(int argc, char **argv){ int i, j, max = 0; int m, n, a; scanf("%d%d", &m, &n); f[0] = 1; for(i = 1; i <= n; i++){ scanf("%d", &a); for(j = max; 阅读全文
posted @ 2011-09-25 18:47 zqynux 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 这题让我学到了一个技术啊,那个什么线段树神马的都是浮云,真的是浮云,查并集才是王道,用好查并集线段树可以秒杀,空间需求更低,效率更高,为什么不用查并集呢!!! f[i]代表i节点所在的集,d[i]代表i距离f[i]之间有多远, 然后更多题解看我转的内容: 初看本题,似乎没有思路,动态规划、贪心、递推等常规方法似乎行不通。但仔细观察题目条件,发现原体实际是告知一部分线段的和,求未知线段的长度。这个问题显然是并查集(注意:与线段树相区分)。 利用一个数组f[i]记录当前位置的父亲,即使用父亲标记法实现并查集。另一个数组d[i]表示当前元素父节点到当前元素的线段长度。显然,位于同一个集合中... 阅读全文
posted @ 2011-09-25 14:12 zqynux 阅读(540) 评论(0) 推荐(0) 编辑
摘要: SPFA,纯搜索,如果走到下一个位置的体力可以更少那就用那个更少的,如果一样多,看走的步数,用少的,就这样一个广搜。 代码如下:#include <math.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#define QMAX 25000struct node{ int x, y;}queue[QMAX];int head, rear;int map[500][500];int used[500][500];void enqueue(int x, int y){ if(use 阅读全文
posted @ 2011-09-25 08:12 zqynux 阅读(425) 评论(0) 推荐(0) 编辑
摘要: 这题考的是压缩,当两个石子之间的距离大于100的时候就让他们变成100,然后计算就十分方便了,代码如下:#include <stdio.h>#include <stdlib.h>#define min(a, b) ((a)<(b)?(a):(b))int num[101];int f[10101];int stone[10101];int com(const void *a, const void *b){ return *(int *)a - *(int *)b;}int main(int argc, char **argv){ int i, j, k; int 阅读全文
posted @ 2011-09-17 22:07 zqynux 阅读(1392) 评论(0) 推荐(0) 编辑
摘要: 这题要先求出矩阵中的第四个点,利用向量,在纸上画一下绕来绕去的就可以得出x=x1+x2-x0. y=y1+y2-y0。因为三个点构成了一个直角三角形,那我就设(x0, y0)90度角的顶点,然后就有上面的那个公式了。嗯,然后就是初始化,再然后就是暴力搜索就是的了。#include <math.h>#include <stdio.h>#include <stdlib.h>int price[100];int x[400], y[400];#define swap(a, b) {int t; t = a; a = b; b = t;}double dis[400 阅读全文
posted @ 2011-09-11 07:37 zqynux 阅读(1327) 评论(0) 推荐(0) 编辑
摘要: 一个类似于数学公式的公式,嗯,语言无法表达,看代码吧,(估计一会儿还真看不懂。)#include <stdio.h>#include <stdlib.h>int main(int argc, char **argv){ int i, j; int k, l, m; int n; scanf("%d", &n); for(i = 1, j = 0; j + i < n; i++){ j += i; } k = (i & 1) ? i : 1; l = (i & 1) ? -1 : 1 ; m = i; for(i = j 阅读全文
posted @ 2011-08-30 11:07 zqynux 阅读(837) 评论(0) 推荐(0) 编辑
摘要: 纯水题,最上面一行去掉,最下面一行去掉,在剩下的(n - 1) * (n - 1)的矩形里面,长度为一的进制数的出现次数减一就是代表几,比如样例吧:5+ L K V EL L K V EK K V E KLV V E KL KKE E KL KK KV 上面,红色的L出现了一次,就代表0,K出现两次就代表1,两位数都不考虑,就这样的:#include <stdio.h>#include <string.h>#include <stdlib.h>char tmp[1000];char str[9];int used[9];int main(int argc, 阅读全文
posted @ 2011-08-29 22:19 zqynux 阅读(884) 评论(0) 推荐(2) 编辑
摘要: SPFA,直接搜索就行,代码如下:#include <stdio.h>#include <stdlib.h>#define Q_MAX 100000char map[1000][1000];int dis[1000][1000];struct node{ int x, y;}queue[Q_MAX];int head, rear;int used[1000][1000];void enqueue(int a, int b){ if(used[a][b]){ return; } used[a][b] = 1; queue[rear].x = a; queue[rear]. 阅读全文
posted @ 2011-08-28 21:03 zqynux 阅读(389) 评论(0) 推荐(0) 编辑
摘要: 树形动态规划,第一次接触这样的树形动态规划,应该说是彻底的,以前的那个什么没有上司的舞会都是小儿科,嗯,思路见网上同类报告(偷懒) 代码:#include <stdio.h>#include <string.h>#include <stdlib.h>int num[1001];struct node{ int left, right; int sum;}tree[1001];int f[1002][102];int m, n;int srch(int root, int count){ int i; int t; if(f[root][count] != 0 阅读全文
posted @ 2011-08-27 23:08 zqynux 阅读(468) 评论(0) 推荐(0) 编辑
摘要: f[i][j] = min{max{f[k - 1][j], f[i - k][j - 1]} + 1}; 然后因为最多1000,2^10=1024所以超过10个蛋都没用了,所以就if(m > 10){m = 10;} 代码:#include <stdio.h>#include <string.h>#include <stdlib.h>#define max(a, b) ((a)>(b)?(a):(b))int f[1001][1001];void deal(int m, int n){ int t, s; int i, j, k; if(m & 阅读全文
posted @ 2011-08-25 18:29 zqynux 阅读(312) 评论(0) 推荐(0) 编辑