posts - 68,  comments - 26,  trackbacks - 0
  2012年5月16日
摘要: http://ace.delos.com/usacoprob2?S=clocks&a=3hMw0XdJ4KO枚举暴力搜索法虽然为暴利搜索,不过结合题目的特点还是需要注意一些技巧的,注意该题目的特点:1每种变换方法可以使用0~3次,因为如果使用4的话,正好转一圈,和0等效。2并且每种变换方法在前与在后是等效的。所以根据题目输出要求,最小字典序。该法枚举每条路径,枚举的顺序很重要,因为找到最小的就停止搜索了,所以控制好枚举顺序有些技巧。根据排列组合基础可以知道,该问题的每种path路径为 1,2,3,4,5,6,7,8,9,11,12,13,。。。。998,999,1112,1113,11阅读全文
posted @ 2012-05-16 00:49 geeker 阅读(17) 评论(0) 编辑
  2011年10月25日
摘要: 自己的代码超时了。。。不应该啊,方法没错哦,明天检查一下吧,网上看到一份不错的代码,不是针对于该题目,而是打印中间过程的方法,很细致,非常有利于debug#include <stdio.h> #include <string.h> //#define DEBUG #ifdef DEBUG #define debug(...) printf( __VA_ARGS__) #else #define debug(...) #endif #define M 530001 #define N 500001 struct trie_node { ...阅读全文
posted @ 2011-10-25 00:09 geeker 阅读(63) 评论(0) 编辑
摘要: //#define DEBUG #ifdef DEBUG #define debug(...) printf( __VA_ARGS__) #else #define debug(...) #endif 这样的话在提交的时候也不用注释掉一些调试的时候需要打印的中间数据了,very good阅读全文
posted @ 2011-10-25 00:06 geeker 阅读(41) 评论(0) 编辑
  2011年10月20日
摘要: RMQ问题如果用线段树实现的话,可以实现O(nlogN)的预处理,O(logN)的查询,速度还可以。以求最大值为例,将key定义为区间的最大值。建立树时初始化为负无穷大把任意点a 看成区间[a,a],先把所有的点插入线段树。然后每次用线段树去查询代码如下:#include<iostream>#include<algorithm>using namespace std;const int MIN=-2000000000;//线段树的节点,包括基本域 :左右边界,左右孩子的指针 信息域:keystruct Node{ int ld,rd;//左右边界 Node *lc,*r阅读全文
posted @ 2011-10-20 19:10 geeker 阅读(70) 评论(0) 编辑
摘要: //线段树的节点//节点包括两部分信息,基本域,和信息域//基本域:左右边界ld,rd. 左右孩子:lc,rc//信息域:key值,如RMQ问题中,信息域中存储的是区间最大值struct Node{ int ld,rd; Node *lc,*rc; int key;};//空树的建立,内含key值的初始化;//一般在主函数中首先调用 Node* root= buildtree(1,n);建立一棵新树Node *buildtree(int a,int b){ Node * p=new Node;//给P申请一块内存 p->ld=a; p->rd=b; //{初始化 p->key阅读全文
posted @ 2011-10-20 19:05 geeker 阅读(163) 评论(0) 编辑
摘要: 给定k个序列s1,s2,s3,...,sk,用二路合并方法将k个序列合并为一个。假设将任意两个长度分别为n和m的序列合并为一个需要的代价是m+n-1,设计一个算法来确定合并这些序列的合并为一个的最大代价和最小代价。#include<iostream>using namespace std;void swap(int &a ,int &b){ int temp=a; a=b; b=temp;}//返回数组arr[]的最大值void maxSink(int arr[],int n,int i){ int child; int j=i; while(j<=n/2){阅读全文
posted @ 2011-10-20 16:07 geeker 阅读(179) 评论(0) 编辑
  2011年10月17日
摘要: 在竞赛中经常涉及到一些以字符串为键值的操作,此情况下用map映射比较好.打一个最简单的比如,十个小孩互相给对方糖,问经过若干次操作之后问他们每一个人手头里有多少糖。其中一个操作,小红给小明小刚分别五块糖。如果采取普通的数据结构,比如struct{string name,int candy};那么还得经过一次循环查找谁叫小明,找到小明之后,在对其相应的糖块数进行修改。当然如果如果用二分查找的话,肯定会效率高一些,但是对于一个小小的且经常用的操作就写一大堆多余代码,肯定会增加程序的易错性。我觉得STL里面的set内部的实现应该是二分的,封装的不错,很容易操作,我们直接用,何乐而不为。#includ阅读全文
posted @ 2011-10-17 16:52 geeker 阅读(81) 评论(0) 编辑
  2011年10月16日
摘要: http://poj.org/problem?id=1141这是一道典型的动态规划题目,过去做过类似的,如POJ3391,思路几乎一摸一样,但是这道题目唯一比较讨厌的地方就是,得构造出最终的最优解,就是得显示出最优解的摸样,本来想通过做标记的方式,把DP的路径记录下来,后来感觉很麻烦,于是又加了一个bestStr[][]数组,元素类型是string,把每一个状态的形态记录了下来,bestStr[0][n-1]即是最优解,但是这样够早的话,可能附加操作比较多,因为每次都涉及很多字符串衔接的操作,导致最终居然超时。。。有时间,换一个方法实现以下好了,不用记忆搜索,换成循环递归实现以下,看看是否能摆阅读全文
posted @ 2011-10-16 23:47 geeker 阅读(91) 评论(0) 编辑
摘要: http://poj.org/problem?id=1988看黑书看到并查集,练了一道并查集的题目,很典型,不是很难,但是细节上的处理还是比较容易出错的。理解题意之后,首先对状态进行建模。分别建立三个数组,意义如下int father[i];//记录 i 的父亲节点,注意不一定是根节点,路径压缩之后才一定是根节点int total[i];//记录集合中元素个数,仅当i为根节点该值才有意义int deep[i];//每棵树距离父亲的距离,注意不是根树,所以每次进行路径压缩压缩的时候,将原父亲改为根节点时不要忘记将深度值也同时进行修改如果输入为Mi j 那么就调用合并函数unin(i,j)如果输入阅读全文
posted @ 2011-10-16 01:26 geeker 阅读(34) 评论(0) 编辑
  2011年10月12日
摘要: 该题,对题目的理解是关键。。。(好恶心)http://poj.org/problem?id=2586题意:有一个公司由于某个病毒使公司赢亏数据丢失,但该公司每月的赢亏是一个定数,要么一个月赢利s,要么一月亏d。现在ACM只知道该公司每五个月有一个赢亏报表,而且每次报表赢利情况都为亏。在一年中这样的报表总共有8次(1到5,2到6,…,8到12),现在要编一个程序确定当赢s和亏d给出,并满足每张报表为亏的情况下,全年公司最高可赢利多少,若存在,则输出多多额,若不存在,输出"Deficit"。分析:在保证连续5个月都亏损的前提下,使得每5个月中亏损的月数最少。 x=1: ssss阅读全文
posted @ 2011-10-12 19:45 geeker 阅读(31) 评论(0) 编辑