上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 14 下一页
摘要: 转自:http://blog.csdn.net/lyflower/article/details/2138221 NOIP是一个比较基础的比赛,大家都说NOIP是考察基本算法的熟练掌握,所以个人认为无论是普及组还是提高组,都要从最最基本的题做起,要达到:只要是简单题,编完就对——不用编译;一般的题,写出来的都是对的——运行后几本上是正确的。为了提高,于是做了一个基本程序题集,以便查找自己的不足之处。题集目录一、贪心算法Problem1删数问题Problem2旅行家的预算Problem3线段覆盖Problem4背包问题Problem5任务调度Problem6果子合并Problem7射击竞赛Pro 阅读全文
posted @ 2011-07-23 15:09 zqynux 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 用列队,按顺序一个个发送信号,然后当一个节点所有信号都接受了c>0就加入列队,然后继续。。。。 网上题解应该比较多,我直接上代码吧:#include <stdio.h>#include <assert.h>#include <stdlib.h>#define QMAX 1000int dot[200];int map[200][200];int link[200][200];int count[200];int queue[QMAX];int rear, head;int in[200], out[200];void enqueue(int k){ i 阅读全文
posted @ 2011-07-21 22:49 zqynux 阅读(865) 评论(0) 推荐(0) 编辑
摘要: 这题和USACO里一题挺像的,具体那题是啥不记得了,反正暴力枚举就行,数据不大,代码如下:#include <stdio.h>#include <string.h>#include <stdlib.h>#define INF 0xFFFFFFF#define min(a, b) ((a)<(b)?(a):(b))int f[101];char str[101];char sub[100][101];int main(int argc, char **argv){ int i, j, k; int n, l; scanf("%s\n" 阅读全文
posted @ 2011-07-21 16:31 zqynux 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 直接使用了系统的排序,感觉有点作弊的感觉。。。代码:#include <stdio.h>#include <string.h>#include <stdlib.h>char str[10000][257];int com(const void *a, const void *b){ return strcmp(a, b);}int main(int argc, char **argv){ int i; int n; scanf("%d\n", &n); for(i = 0; i < n; i++){ scanf(" 阅读全文
posted @ 2011-07-21 16:18 zqynux 阅读(216) 评论(0) 推荐(0) 编辑
摘要: N比较小,暴力搜就行,代码如下:#include <stdio.h>#include <stdlib.h>int num[20];int ans = 0xFFFFFFF, n, m;int t;void srch(int now){ if(now == n){ if(t >= m && t < ans){ ans = t; } if(t == m){ printf("0\n"); exit(0); } return; } srch(now + 1); t += num[now]; srch(now + 1); t -= n 阅读全文
posted @ 2011-07-21 16:13 zqynux 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 贪心,转题解:很好的一道贪心。首先一个需要明确的问题就是因为要分成1*1的格子,所以每一条边肯定都要切,只不过是切的次数的多少有所不同。对于每一条纵边来说,它所需要切得次数等于在这条纵向边切之前的已经切的横边的次数。对于横边就看纵边。这样,一个很显然的想法就是让代价大的先切,这样的话满足代价大的切得次数少。把横边和纵边排个序,然后不断的维护ans即可。 代码:#include <stdio.h>#include <stdlib.h>int heng[2000], shu[2000];int ans;int com(const void *a, const void *b 阅读全文
posted @ 2011-07-21 11:54 zqynux 阅读(312) 评论(0) 推荐(0) 编辑
摘要: 好题!第一,不好理解,考验!第二,锻炼了我使用C的负数坐下标的能力。 题目是个DP,f[i][j]代表以j开头的,长度为i的等差序列的数目,最后要输出的时f[i][j](-1000<=i<=1000, 0 <= j < n)(我用的C, 所以j是[0, n)。) 转移方程是:f[num[i] - num[j]][i] = f[num[i] - num[j]][i] + f[num[i] - num[j]][j] + {1}如果num[i] - num[j]不等于0就加一,代码如下:#include <stdio.h>#include <stdlib.h 阅读全文
posted @ 2011-07-19 23:36 zqynux 阅读(309) 评论(0) 推荐(0) 编辑
摘要: 超猥琐的题目,该怎么说,用a做01背包的体积,b做价值,然后pascal有一个很好的机制,可以使用负数做下标,但是C没有,于是乎就像到了指针,具体实现机制看代码吧,然后就是还有一个,初始状态f[0]=0,f[i] = -∞,然后要维护DP的界,代码如下:#include <stdio.h>#include <stdlib.h>int a[100], b[100];int f_[200001];int (*f);int ans;int main(int argc, char **argv){ int n; int i, j; int max = 0, min = 0; s 阅读全文
posted @ 2011-07-18 13:39 zqynux 阅读(298) 评论(0) 推荐(0) 编辑
摘要: 啊啊啊啊,越来越没用了,这么简单的题不知道提交了多少次。!~~ 直接模拟就是,不好维护的是最大高度,因为高度的范围是(0, maxin),但是这个maxint是pascal的,是32767,所以果断用used[i]保存高度为i的有多少人。 代码:#include <stdio.h>#include <stdlib.h>#define MAX 500000int used[32768];int queue[MAX];int head, rear;int count;int max;void enqueue(int k){ count++; used[k]++; queue 阅读全文
posted @ 2011-07-18 10:08 zqynux 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 我越来越2了,这么假简单的题目竟然能想到DP去,啊啊啊怎么办啊,,上代码:#include <stdio.h>#include <stdlib.h>int num[20000];int start;int com(const void *a, const void *b){ return *(int *)b - *(int *)a;}int main(int argc, char **argv){ int i; int n, a = 0, b; scanf("%d%d", &n, &b); for(i = 0; i < n; i 阅读全文
posted @ 2011-07-17 22:16 zqynux 阅读(207) 评论(0) 推荐(0) 编辑
上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 14 下一页