摘要:
....太水了...排序,输出, Ok.#include <stdio.h>#include <string.h>#include <stdlib.h>char name[10000][100];int num[10000];int com(const void *a, const void *b){ return *(int *)a - *(int *)b;}int com_(const void *a, const void *b){ return strcmp(a, b);}int main(int argc, char **argv){ int i; 阅读全文
摘要:
说是说一颗星啊,但是空间要考虑啊,这种图的结构是我第二次写,上一次我也不记得是什么时候了,反正是看到别人的代码写的,觉得这种结构挺好的!!线性存放整个图,使用起来也方便,就是不大好理解,我也不打算解释(个人很懒,语文成绩也不好,说不清楚。毕竟只是报告嘛,没打算太给别人看,呵呵。懒。。)。 代码:#include <stdio.h>#include <assert.h>#include <stdlib.h>int head[100000];int next[200000];int edge[200000];int end;void add(int a, int 阅读全文
摘要:
怎么讲。。纯水题吧,随便搜一下就可以了。 不过搜法也有很多,我第一次写的是直接求距离,因为要开平方,又是O(n^2)的复杂度,所以没超时。但是最后一个数据293ms,有点危险,看了下题解,有好方法,直接使用x^2+y^2,不开平方,毕竟就是比较距离嘛! 写出来的那个代码全部WA了,不知道怎么回事,好困了,明天继续写。——2011年7月6日 22:53:12 也不知道怎么回事,重写一次就直接AC。 有点无语的说,上代码:#include <stdio.h>#include <stdlib.h>struct dot{ int x, y;}dot[2000];double g 阅读全文
摘要:
USACO原题,做过几次了,所以一次AC,就是暴搜,因为数据小。 先把每个牧区的直径求出来,然后再把在一个牧区中距离任意节点的最远距离算出来,然后暴搜,若i,j之间加一条路,那么新牧区的半径要么就是i所在的牧区的的直径,要么是j所在的牧区的直径,要么就是i所在的牧区中距i最远的距离加上j所在的牧区中距j最远的距离加上i,j之间的距离。 看代码最有效:#include <math.h>#include <stdio.h>#include <stdlib.h>#define INF 100000000struct dot{ int x, y;}dot[150]; 阅读全文
摘要:
刚接手真的好难,因为是MOD100啊,本来可能很大了,结果MOD一下就变成0了,一个很小的值就是最佳答案了。 对此,解决方法是用f[a][b][i]来代表第a行第b列能否产生出值为i的路径,如果能则为1,不能则为0。网上有一个人给它取名我挺喜欢,叫做布尔染色。然后方程就是f[a][b][i] = max(f[a + 1][b + 1][(100 + i - num[a][b]) % 100] +f[a + 1][b][(100 + i - num[a][b]) % 100]),我代码的DP和这个不一样,因为代码比理论感觉简单一点,不废话了,上代码: Ps: 最近比较喜欢用函数来写DP,然后用. 阅读全文
摘要:
真的好悲催,不知道是手生了还是蠢了,查了好久发现问题出在宏上面把变量名写错了。 这题比较简单吧,就是一个模拟,或者说BFS,广搜。。代码:#include <stdio.h>#include <assert.h>#include <stdlib.h>#define MAX 50000char map[150][151];struct { int x, y;}queue[MAX];int start, end;int cost[150][150];int used[150][150];void enqueue(int a, int b){ int t = (e 阅读全文
摘要:
DP,最近做TYVJ感觉挺有效果的,比较难得先跳过,前期先练手感,把手感练好了,再慢慢提升难度。 题目比较简单,调试了好一阵,提交了几次,羞愧。。代码:#include <stdio.h>#include <stdlib.h>unsigned num[30], f[30][30];int p[30][30];unsigned ans(int s, int t){ int i; unsigned a = 0, b; if(s == t){ return num[s]; } if(s > t){ return 1; } if(f[s][t]){ return f[s] 阅读全文
摘要:
呼,写死我了,最开始写的DP,没太仔细想,结果!!超时,超得真过瘾啊!呵呵,后来知道该用贪心,就是相当于一个”赫夫曼树“,当然,我没用那算法,也不记得那算法了,用的堆,不过也好久没写了,提交至少5次,最后发现主要的问题是出在一个寻找父节点的那个宏上。手生了,联系了一下堆。#include <stdio.h>#include <stdlib.h>int heap[10001];int len, ans;#define left(i) (((i) << 1) + 1)#define right(i) (((i) << 1) + 2)//把parent 阅读全文
摘要:
这题一开始确实会感觉很难,但是罗马数字的个位只有可能是{"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},同理,十位上的数字也永远都是固定的,所以还是简单吧,实现代码如下:#include <stdio.h>#include <stdlib.h>char num[4][10][5] = { {"", " 阅读全文
摘要:
这题值得好好探讨一下,因为其中的算法真的很巧妙,不过我也说不太清楚。 设l, r是最长NUM序列的左右坐标,r-l+1就是NUM序列的长度,开始一直读入,r不断的增加,当1-m的所有数字都出现后,就开始边循环边判断,如果num[l]出现了两次就可以把l向右移动了,大致的思路就是这样,看看代码吧:#include <stdio.h>#include <string.h>#include <stdlib.h>int used[200001];int num[200000];int l, r;int main(int argc, char **argv){ int 阅读全文