HDU4515 小Q系列故事——世界上最遥远的距离
摘要:题目链接。分析:原来一天天数是这样简单。。#include <stdio.h>int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int is_leap(int n){ return ((n % 4 == 0 && n % 100 != 0) || (n % 400 == 0));}void pre(int n){ int y = 2013, m = 3, d = 24; while(n--){ d--; if(d == 0){ m--; ...
阅读全文
posted @
2013-03-31 15:56
Still_Raining
阅读(186)
推荐(0)
ZOJ2972 Hurdles of 110m(dp)
摘要:题目链接。分析:这题是几周前比赛时没有做出来的一道。说来惭愧,比完赛,翻翻解题报告也没看懂,就把这题放下了。今天闲来没事,做了做,一遍AC。果然应了那句古话,岁月不饶人(题)啊。设dp[i][j]表示第i个阶段j能量所耗费的时间状态转移方程:dp[i][j] = min(dp[i][j], dp[i-1][j-F1]+T1) (Fast Mode)dp[i][j] = min(dp[i][j], dp[i-1][j]+T2) (Normal Mode)dp[i][j] = min(dp[i][j], dp[i-1][j+F2]+T3) (Slow Mode)AC代码如下:#in...
阅读全文
posted @
2013-03-30 21:33
Still_Raining
阅读(234)
推荐(0)
ZOJ1700 Falling Leaves
摘要:题目链接。分析:题目一开始说了一大堆,以为没用,就没看。然后题不会做。后来把题目仔细看了一遍。。恍然大悟。这题的树好像叫二叉搜索树(表示木听过)。。逆序见树。#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct node{ char ch; struct node *left, *right;}node;void del(node *T){ if(T){ if(T->left) del(T->left); if(T->right) del(T->r
阅读全文
posted @
2013-03-30 19:59
Still_Raining
阅读(330)
推荐(1)
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
阅读(174)
推荐(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)
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
阅读(302)
推荐(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
阅读(272)
推荐(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
阅读(231)
推荐(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
阅读(188)
推荐(0)
大数运算
摘要:最近在看《挑战编程》的高精度,又学到了很多。但是,单从实用性来说,它的实现方式复杂了,而这里就要求更容易在比赛中实现的模版。大数加法,请参照本博客的一篇题解。大数减法:void subtract_big(char *a, char *b, char *c){ int i, j, flag=0; int len1 = strlen(a), len2 = strlen(b); char *pmax = a, *pmin = b; memset(c, 0, sizeof(c)*max(len1, len2)+3); if(len2 > len1 || (len1 == ...
阅读全文
posted @
2013-03-20 22:01
Still_Raining
阅读(262)
推荐(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
阅读(196)
推荐(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
阅读(200)
推荐(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)
dij+heap
摘要:学了一下dij+heap用它做了做HDU2544遇到了两个问题:1.堆数组H开的太小会RE2.对于该题跑时15ms, 不加优化15ms,spfa跑时0ms探究:1.对于第一个问题:结点是会被重复加入的。因为每次松弛时,都会有结点加入堆,因此加入堆的结点总数会大于总的结点数。2.对于第二个问题,在网上找了找资料,迷茫中闪现一丝曙光。资料地址:http://blog.csdn.net/lyso1/article/details/5687180#include <stdio.h>#include <string.h>#include <stdlib.h>#defi
阅读全文
posted @
2013-03-12 15:21
Still_Raining
阅读(814)
推荐(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
阅读(253)
推荐(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
阅读(423)
推荐(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
阅读(345)
推荐(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
阅读(330)
推荐(0)
HDU1248 漫步校园(记忆化搜索,spfa)
摘要:题目链接。分析:他考虑从A区域到B区域仅当存在一条从B到机房的路线比任何一条从A到机房的路线更近(否则可能永远都到不了机房了…)。这句话是本题的关键。我WA了很多次。。也是因为没有看懂该话。本题思路就是先用spfa求出(n,n)到各点的最短路,然后用记忆化搜索。AC代码如下:#include <stdio.h>#define MAXN 55const int INF = (1<<24);const int MAX_QUE = MAXN*MAXN;typedef struct Pos{ int x, y;}Pos;Pos q[MAXN*MAXN];int G[MAXN][
阅读全文
posted @
2013-03-04 22:16
Still_Raining
阅读(267)
推荐(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
阅读(341)
推荐(0)
堆——数据结构
摘要:堆(最大堆)的操作,以下函数用A[0]来存放元素的个数:void swap(int A[], int i, int j); //交换两个元素1.void sift_up(int A[], int i); //把堆中第i个元素上移2.void sift_down(int A[], int i); //把堆中的第i个元素下移3.void heap_insert(int A[], int x); //把元素x插入堆中4.void heap_delete(int A[], int i); //删去堆中第i个元素5.int delete_max(int A[]); //删除堆中...
阅读全文
posted @
2013-03-01 21:28
Still_Raining
阅读(271)
推荐(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
阅读(212)
推荐(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)