上一页 1 ··· 5 6 7 8 9 10 11 12 13 下一页
  2013年3月22日
摘要: 题目链接。分析:在虚拟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)
  2013年3月21日
摘要: 题目链接。分析:简单的大数加法。注意: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)
  2013年3月20日
摘要: 题目链接。分析:简单的大数乘法。#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)
摘要: 最近在看《挑战编程》的高精度,又学到了很多。但是,单从实用性来说,它的实现方式复杂了,而这里就要求更容易在比赛中实现的模版。大数加法,请参照本博客的一篇题解。大数减法: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) 推荐(0)
  2013年3月19日
摘要: 题目链接。分析:水题,但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)
  2013年3月18日
摘要: priority_queue调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法实现,也算是堆的另外一种形式。先写一个用 STL 里面堆算法实现的与真正的STL里面的 priority_queue用法相似的priority_queue, 以加深对 priority_queue 的理解?#include <iostream>#include <algorithm>#include <vector>usingnamespacestd;classpriority_queue{private:vector<int& 阅读全文
posted @ 2013-03-18 13:44 Still_Raining 阅读(156) 评论(0) 推荐(0)
摘要: 题目链接。分析:原来是哈夫曼,想错了。比赛的时候以为水题呢。#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)
  2013年3月14日
摘要: 题目链接。分析:一看题就知道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)
  2013年3月12日
摘要: 学了一下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) 推荐(0)
  2013年3月11日
摘要: 题目链接。分析:本题难点在于看不懂题(英语真的很重要)。该题是输出小于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)
  2013年3月10日
摘要: 题目链接。分析:这题是比赛的题,当时没做出来。后来看了一下题解明白了。首先看一下异或:对一行(列)改变奇数次,相当于改变了一次,改变偶数次,相当于没改变。用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)
  2013年3月7日
摘要: 题目链接。分析:该题的状态转移方程为: 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)
  2013年3月5日
摘要: 题目链接。分析:本题和最长公共子序列是相识的。关键是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 阅读(326) 评论(0) 推荐(0)
  2013年3月4日
摘要: 题目链接。分析:他考虑从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 阅读(266) 评论(0) 推荐(0)
摘要: 题目链接。分析:本题就是有一条边的权值可以减半情况下的求两点间的最短路。一开始我想的是先求出不考虑减半情况下的最短路,然后将最短路中的最大权值减半。这样得到的结果是不对的。如下图:如果先找不减半最短路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)
  2013年3月1日
摘要: 堆(最大堆)的操作,以下函数用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 阅读(270) 评论(0) 推荐(0)
摘要: 题目链接。代码如下:#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)
摘要: 题目链接。分析:水.#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)
  2013年2月28日
摘要: 题目链接。分析:这题很简单。就是差分约束。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)
  2013年2月27日
摘要: 题目链接。分析:对于任意i号奶牛,1<=i<N,在距离上应该满足:D[i+1] - D[i] >= 0对于每个好感的描述(i,j,k),假设i<=j,体现到距离上的要求就是:D[j] - D[i] <= k对于每个反感的描述(i,j,k),假设i<=j,体现到距离上的要求就是:D[j] - D[i] >= k写成我们约定的形式:D[i] - D[i+1] <= 0D[j] -D[i ]<= kD[i] - D[j] <= - k1.对于差分不等式,a - b <= c ,建一条 b 到 a 的权值为 c 的边,求的是最短路,得到 阅读全文
posted @ 2013-02-27 20:21 Still_Raining 阅读(2176) 评论(0) 推荐(0)
上一页 1 ··· 5 6 7 8 9 10 11 12 13 下一页