随笔分类 -  acm

上一页 1 2 3 4 5 6 7 8 下一页
POJ1035 Spell checker
摘要:题目链接。分析:对于该题,使用的是字典树。暴力。不过一开始忽略了个问题:对于第三个inserting of one arbitrary letter into the word.忽略了一种情况。那就是有字符串中含有相邻的相同字符。例如,aab,在0号插入a和1号插入a,新得到的字符串都是aaab。在输出时注意下就行了。#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct TrieNode{ int flag, order; struct TrieNode *next[27 阅读全文
posted @ 2013-03-29 23:35 Still_Raining 阅读(172) 评论(0) 推荐(0)
POJ1734Sightseeing trip(最小环)
摘要:题目链接。分析:请参考本文章。AC代码(输出的顺序不唯一):#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAXN 102#define min(x, y) ((x)<(y)?(x):(y))const int INF = (1<<24);int G[MAXN][MAXN], dis[MAXN][MAXN], pre[MAXN][MAXN], path[MAXN];int n, m, min_cost, cnt;void floyd(){ int i, j, 阅读全文
posted @ 2013-03-26 15:10 Still_Raining 阅读(206) 评论(0) 推荐(0)
ZOJ3631 Watashi's BG(01背包,dfs)
摘要:题目链接。分析:这题就是01背包。dp数组开不到10000000,表示木办法,然后就用了dfs,TLE,剪了几下还是TLE。跟人学了下其它剪枝,过了。#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 35#define INF 10000010int w[MAXN];int n, m, min;int cmp(const void *a, const void *b){ return *(int *)a - *(int *)b > 0 ? -1 : 1;}void 阅读全文
posted @ 2013-03-24 10:29 Still_Raining 阅读(301) 评论(0) 推荐(0)
POJ3032 Card Trick(队列)
摘要:题目链接。分析:在虚拟OJ做的时候卡了下(没读懂题)。题意大体是这样的,举个例子吧。对于2143,先拿1次,2放到队列末端变成1432,拿走1,剩下432;拿2次,(4,3)放到末端,变成2,4,3,拿走2,剩下4,3;拿3次,把4拿到末端,变成3,4(第一次),拿3到末端,变成4,3(第二次),拿4到末端,变成3,4(第3次),拿走3,剩下4. OK结束了。思路就是倒着模拟,用的是循环队列。#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 100int qu[MAXN] 阅读全文
posted @ 2013-03-22 22:34 Still_Raining 阅读(271) 评论(0) 推荐(0)
HDU1047 Integer Inquiry(大数加法)
摘要:题目链接。分析:简单的大数加法。注意:1.处理结果前导02.0000+000这样的情况AC代码如下:#include <stdio.h>#include <string.h>#include <stdlib.h>#define max(a, b) ((a)>(b)?(a):(b))void add_big(char *a, char *b, char *c){ int len1 = strlen(a), len2 = strlen(b), len3; int i, j, k; len3 = max(len1, len2)+2; memset(c, 0, 阅读全文
posted @ 2013-03-21 14:54 Still_Raining 阅读(227) 评论(2) 推荐(0)
POJ2389 Bull Math(大数乘法)
摘要:题目链接。分析:简单的大数乘法。#include <stdio.h>#include <string.h>#include <stdlib.h>void multiply_big(char *a, char *b, char *c){//大数乘法 int len1 = strlen(a), len2 = strlen(b), *s; int i, j; s = (int *)malloc(sizeof(int)*len1*len2); for(i=0; i<len1+len2; i++) s[i] = 0; for(i=0; i<len1; i+ 阅读全文
posted @ 2013-03-20 22:29 Still_Raining 阅读(187) 评论(0) 推荐(0)
HDU1013 Digital Roots
摘要:题目链接。分析:水题,但WA了很多次,发上来引以为戒。陷阱:大数。#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 20000int main(){ char s[MAXN]; int len, i; __int64 n, t; while(gets(s) && s[0] != '0'){ len = strlen(s); n = 0; for(i=0; i<len; i++) n += s[i] - '0'; whi 阅读全文
posted @ 2013-03-19 21:05 Still_Raining 阅读(192) 评论(0) 推荐(0)
SDUT2423 Fence Repair(哈夫曼树)
摘要:题目链接。分析:原来是哈夫曼,想错了。比赛的时候以为水题呢。#include <stdio.h>#include <stdlib.h>#define MAXN 20010int a[MAXN];int cmp(const void *a, const void *b){ return (*(int *)a) - (*(int *)b);}int main(){ int n, i, j, t; long long ans=0; scanf("%d", &n); for(i=0; i<n; i++){ scanf("%d" 阅读全文
posted @ 2013-03-18 11:09 Still_Raining 阅读(199) 评论(0) 推荐(0)
HDU1028 Ignatius and the Princess III(dp)
摘要:题目链接。分析:一看题就知道dp,dp不出来。上网查,怎么也看不懂。现在看懂了,觉得真简单,没看懂时,费老大劲了。在这里要感谢下崔学长和尚学姐(在百度搜,搜到了,讲解很精辟,讲解地址,崔学长在一楼,尚学姐在11楼)。另外,又发现一个母函数的知识点,抽空学习下。代码如下:#include <stdio.h> #include <string.h> #define MAXN 150 int dp[MAXN][MAXN]; int main(){ int n, i, j; memset(dp, 0, sizeof(dp)); for(i=1; i<=120; i++){ 阅读全文
posted @ 2013-03-14 19:34 Still_Raining 阅读(177) 评论(0) 推荐(0)
HDU4151 The Special Number
摘要:题目链接。分析:本题难点在于看不懂题(英语真的很重要)。该题是输出小于n的special number的数量(quantity)。暴力+二分。AC代码如下:#include <stdio.h>#include <string.h>#define MAXN 10000010int q[MAXN];unsigned char hash[11];int main(){ int n, i, t, top=0, high, low, mid, pos; for(i=1; i<=MAXN; i++){ memset(hash, 0, sizeof(hash)); t... 阅读全文
posted @ 2013-03-11 22:38 Still_Raining 阅读(251) 评论(0) 推荐(0)
HDU4146 Flip Game
摘要:题目链接。分析:这题是比赛的题,当时没做出来。后来看了一下题解明白了。首先看一下异或:对一行(列)改变奇数次,相当于改变了一次,改变偶数次,相当于没改变。用flag数组来标记最后的结果,即改没改变。还有一个问题,对于(xi,yi)要改变两次(即相当于没改变),当每次操作时,对所在行改变一次,对所在列改变一次,那么行列的交叉点(xi,yi)也就相当于没改变,符合题意。还有flag关于异或的问题。当前的flag只有两个值,即0,1当0异或1时,结果为1,也就是说要改变;当0异或0时,结果为0,也就是说不要改变;等等等等。最后一个问题:发现当把标记数组定义为int时是会超时的。但是用unsigned 阅读全文
posted @ 2013-03-10 21:51 Still_Raining 阅读(418) 评论(0) 推荐(0)
HDU1114 Piggy-Bank(完全背包,dp)
摘要:题目链接。分析:该题的状态转移方程为: f[v]=min{f[v],f[v-w[i]]+p[i]},将所有值初始化为无穷大AC代码如下:#include <stdio.h>#define MAXN 10010const int INF = (1<<25);int dp[MAXN];int main(){ int T, vol, vol1, vol2, n, i, w[550], p[550], j; scanf("%d", &T); while(T--){ scanf("%d %d", &vol1, &vo 阅读全文
posted @ 2013-03-07 19:42 Still_Raining 阅读(341) 评论(0) 推荐(0)
HDU1243 反恐训练营(dp)
摘要:题目链接。分析:本题和最长公共子序列是相识的。关键是dp数组的定义,直接定义dp[2500][2500]在网上查了一下。优化了下代码。跑时156 AC代码如下:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 2500int dp[2][MAXN];int main(){ int n, len1, len2, i, j, now, pre; char s1[MAXN], s2[MAXN], s[MAXN]; int point[30]; while(s 阅读全文
posted @ 2013-03-05 20:19 Still_Raining 阅读(325) 评论(0) 推荐(0)
SDUT2493 Constructing Roads(最短路,spfa)
摘要:题目链接。分析:本题就是有一条边的权值可以减半情况下的求两点间的最短路。一开始我想的是先求出不考虑减半情况下的最短路,然后将最短路中的最大权值减半。这样得到的结果是不对的。如下图:如果先找不减半最短路1->2->3。总花费为11。将最大的8除以2,所得结果为7。而从1到3将边权减半得到的是6.所以符合题意的最短路应该为1->3。所以先不考虑减半求最短路的想法是走不通的。如此的话,本题可以用两次spfa分别求两个点到所有点的最短路,然后分别枚举每一条边权值减半的情况。AC(未优化)代码如下:View Code #include <cstdio>#include &l 阅读全文
posted @ 2013-03-04 11:09 Still_Raining 阅读(338) 评论(0) 推荐(0)
HDU1875 畅通工程再续
摘要:题目链接。代码如下:#include <stdio.h>#include <stdlib.h>#include <math.h>const double INF = (1<<25);#define MAXN 103#define MAXM 10010struct Pos{ int x, y;}pos[MAXN];int vis[MAXN];double G[MAXN][MAXN], d[MAXN], ans;double calc(struct Pos a, struct Pos b){ int k = (a.x-b.x)*(a.x-b.x)+( 阅读全文
posted @ 2013-03-01 19:31 Still_Raining 阅读(210) 评论(0) 推荐(0)
HDU1879 继续畅通工程
摘要:题目链接。分析:水.#include <stdio.h>#include <stdlib.h>#define MAXN 100#define MAXM 6000int p[MAXN], cnt, ans;int find(int x){return p[x] == x ? x : (p[x]=find(p[x]));}struct node{ int u, v, w, flag;}edge[MAXM];int cmp(struct node *a, struct node *b){ return (*a).w - (*b).w;}int Union(int x, int 阅读全文
posted @ 2013-03-01 19:16 Still_Raining 阅读(170) 评论(0) 推荐(0)
POJ3159 Candies(差分约束)
摘要:题目链接。分析:这题很简单。就是差分约束。d[B]-d[A]<=C。不过在用spfa提交时一直TLE。不明白为什么,一查才知道这题要用栈(据说栈有时会比队列快?)。。虽说AC了。但总觉得。莫名其妙。思考一番,应该是对spfa的优化不是很了解。再者,听说用dijkstra+heap一般不会被卡住,所以我决定要开始学习堆、以及spfa的各种优化了。。加油。加油!!!#include <cstdio>#include <stack>using namespace std;#define MAXN 30010#define MAXM 150010const int INF 阅读全文
posted @ 2013-02-28 21:56 Still_Raining 阅读(501) 评论(0) 推荐(0)
HDU1874 畅通工程续(最短路)
摘要:题目链接。分析:本题只要考虑重边的问题,基本上就没其它问题了。#include <stdio.h>#define MAXN 202const int INF = (1<<26);int dis[MAXN], G[MAXN][MAXN], vis[MAXN];void Init(int n){ int i, j; for(i=0; i<n; i++){ vis[i] = 0; } for(i=0; i<n; i++){ for(j=0; j<n; j++){ G[i][j] = INF; } }}voi... 阅读全文
posted @ 2013-02-27 19:53 Still_Raining 阅读(187) 评论(0) 推荐(0)
HDU2647 Reward(拓扑排序)
摘要:题目链接。分析:我使用结构的是边表。1.因为只有满足偏序关系才能应用拓扑排序(即u>v要改成v<=u),所以在建立临边时要注意。2.在拓扑排序过程中,如果发现环,那么结果便是No。3.至于每个点的具体值,我用了一个一维数组vis来辅助标记。AC代码如下:#include <stdio.h>#include <string.h>#define MAXN 10010#define MAXM 20010struct node{ int to; int next;}node[MAXM];int head[MAXN], top, n, m, indegree[MAXN 阅读全文
posted @ 2013-02-26 21:17 Still_Raining 阅读(261) 评论(0) 推荐(0)
HDU2094 产生冠军(拓扑排序)
摘要:题目连接。分析:想了很多很多。全部WA了。。没想到是找入度为0的点。。如果个数为1个Yes,否则No。。(因为这题仅仅是找冠军而已)#include <stdio.h>#include <string.h>#define MAXN 1005int n, top_name, indegree[MAXN];char name[MAXN][15];void Init(){ top_name = 0; memset(indegree, 0, sizeof(indegree));}int find_str(char *s){ int i; for(i=0; i<top_na 阅读全文
posted @ 2013-02-26 21:01 Still_Raining 阅读(914) 评论(0) 推荐(0)

上一页 1 2 3 4 5 6 7 8 下一页