<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Zachary的旅途]]></title><description><![CDATA[尽管我走的很慢，但我从未停止脚步。]]></description><link>https://blog.youkuaiyun.com/Terry__J</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Terry__J]]></copyright><item><title><![CDATA[hdu 1671 Phone List 字典树]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7541891</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7541891</guid><author>Terry__J</author><pubDate>Mon, 07 May 2012 12:27:23 +0800</pubDate><description><![CDATA[题意：判断是否有一电话号码是另一个的前缀。
思路：建立字典树， 参考维基百科：http://zh.wikipedia.org/wiki/Trie
需要注意的是最后释放内存，否则会MLE。
#include 
#include 
#include 
#include 
using namespace std;

const int N = 10;

struct Trie {
    bool]]></description><category></category></item><item><title><![CDATA[hdoj 3038How Many Answers Are Wrong 并查集]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7462538</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7462538</guid><author>Terry__J</author><pubDate>Sun, 15 Apr 2012 12:13:41 +0800</pubDate><description><![CDATA[思路：以区间标号大的为根建树，sum[a] 表示从a+1开始到当前根节点的和。剩下的就是并查集的操作了。
#include 
#include 
#include 

using namespace std;

const int N = 200100;

int p[N], sum[N];
int ans, n, m;

void init() {
    int i;
    ans = 0]]></description><category></category></item><item><title><![CDATA[poj 3268 Silver Cow Party]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7457758</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7457758</guid><author>Terry__J</author><pubDate>Fri, 13 Apr 2012 14:27:57 +0800</pubDate><description><![CDATA[思路：单源最短路，套用spfa模板，这里需要构造逆向边，调用两次spfa。
#include 
#include 
#include 
#include 
#include 

using namespace std;

const int N = 10009;
const int inf = 1<<30;

typedef struct node {
    int v, w, next;
}]]></description><category></category></item><item><title><![CDATA[hdoj 4006 The kth great number]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7454788</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7454788</guid><author>Terry__J</author><pubDate>Thu, 12 Apr 2012 17:26:36 +0800</pubDate><description><![CDATA[思路：用优先队列维护前k个大的元素，每次查询时，队首元素即为所求答案。
#include 
#include 
#include 
#include 
#include 
using namespace std;

priority_queue, greater > q;

int main()
{
    int n, k;
    while (scanf("%d %d", &n, &k)]]></description><category></category></item><item><title><![CDATA[hdoj Buy the Ticket]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7445047</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7445047</guid><author>Terry__J</author><pubDate>Tue, 10 Apr 2012 13:47:30 +0800</pubDate><description><![CDATA[算法分析：
首先假设人无区别
令f(m,n)表示有m个人手持￥50的钞票，n个人手持￥100的钞票时共有的方案总数。则可以分以下情况讨论这个问题：
（1）当n=0时   n=0意味着排队购票的所有人手中拿的都是 ￥50的钞票，那么这m个人排队方案总数为1。
（2）当m

(3)其他情况：
  考虑（m+n）个人排队购票的情景，第（m+n）人站在第（m+n-1）个人的后面，则第（m+n]]></description><category></category></item><item><title><![CDATA[hdoj 4198 Quick out of the Harbour 优先队列 + bfs]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7435769</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7435769</guid><author>Terry__J</author><pubDate>Sat, 07 Apr 2012 18:41:38 +0800</pubDate><description><![CDATA[思路：对于普通迷宫求解，bfs可以到到唯一解，也是最优解。但对于不同点具有不同权值的地图就不一定了，很可能最优值会被pass掉，但使用优先队列的话，访问当前的点总是以前一个优先权最高的点访问的。
#include 
#include 
#include 
#include 
#include 

using namespace std;

const int N = 509;

struct n]]></description><category></category></item><item><title><![CDATA[hdoj 1147 Pick-up sticks 计算几何]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7425923</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7425923</guid><author>Terry__J</author><pubDate>Wed, 04 Apr 2012 16:54:35 +0800</pubDate><description><![CDATA[思路：判断第i根木棍是否在顶上，只需判断它是否被第i+1到第n根覆盖，并标记被覆盖的木棍。
#include 
#include 
#include 
#include 

using namespace std;

const int N = 100009;

struct Point{
    double x, y;
};

struct Line {
    Point p1, p2;]]></description><category></category></item><item><title><![CDATA[hdoj 1257 最少拦截系统]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7422038</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7422038</guid><author>Terry__J</author><pubDate>Mon, 02 Apr 2012 17:59:42 +0800</pubDate><description><![CDATA[思路：用一数组dp[]维护需要系统的个数以及每套系统可以拦截的导弹的最低高度，显然dp[1] = a[1](a[]表示所有导弹),若一导弹的高度大于当前系统所达到的高度，则说明需要新加一个系统，值为当前导弹的高度，可以看出dp[j] > dp[i](0

#include 
#include 
#include 
#include 

using namespace std;

const i]]></description><category></category></item><item><title><![CDATA[ural 1306. Sequence Median]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7421666</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7421666</guid><author>Terry__J</author><pubDate>Mon, 02 Apr 2012 14:57:19 +0800</pubDate><description><![CDATA[思路：此题不能存储所有元素，否则会MLE，想到用优先队列（默认值大的优先级高），存储一半，剩下的一半依次和队首比较，若小于队首，则将队首元素出队，新元素入队。
最后，若n为奇数，队首元素即为中间值；n为偶数，队列前两个的平均值为答案。
#include 
#include 
#include 
#include 
#include 

using namespace std;

typedef]]></description><category></category></item><item><title><![CDATA[ural 1654 Cipher Message]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7421087</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7421087</guid><author>Terry__J</author><pubDate>Mon, 02 Apr 2012 09:30:57 +0800</pubDate><description><![CDATA[思路：数据结构的题目，模拟栈的操作：若栈为空，则将原串的字符入栈，若栈不为空且栈顶元素与原串中的相同，则出栈；新入栈的元素需同之前的比较，若相同都出栈。
#include 
#include 
#include 
#include 

using namespace std;

const int N = 250009;
char s[N];
char ans[N];

int main(voi]]></description><category></category></item><item><title><![CDATA[ural 1073. Square Country 动态规划]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7420367</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7420367</guid><author>Terry__J</author><pubDate>Sun, 01 Apr 2012 20:23:58 +0800</pubDate><description><![CDATA[题意：给定一个数N，求组成N的最少的平方数的个数。
思路：动态规划，我们知道dp[1] = 1，dp[2] = 2, dp[3] = 3, dp[4] = 1...
若 n = i+j*j，则dp[n] = min(dp[i]+1)(i+j*j=n)
#include 
#include 
#include 

using namespace std;

const int N = 6000]]></description><category></category></item><item><title><![CDATA[HDOJ Error Curves 计算几何]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7417062</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7417062</guid><author>Terry__J</author><pubDate>Sat, 31 Mar 2012 20:28:10 +0800</pubDate><description><![CDATA[题意：在给定的n个抛物线中，求 min(F(x)), F(x) = max(S(x)).
思路：由于给定的抛物线都是开口向上的（0 ≤ a ≤ 100）F(x)也是开口向上的类抛物线，具有单峰值，利用三分求解 。
#include 
#include 
#include 
#include 
#include 

using namespace std;

#define eps 1e-10]]></description><category></category></item><item><title><![CDATA[hdoj 3711 Binary Number]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7416164</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7416164</guid><author>Terry__J</author><pubDate>Sat, 31 Mar 2012 16:06:57 +0800</pubDate><description><![CDATA[来源：2010
 Asia Chengdu Regional Contest
思路：简单题，计算最小不同位的个数。
#include 
#include 
#include 
#include 

using namespace std;

const int MAX = 110;
const int INF = 1000001;
int a[MAX], b[MAX];
int n, m;]]></description><category></category></item><item><title><![CDATA[hdoj 3209 Jumping Hands]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7415108</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7415108</guid><author>Terry__J</author><pubDate>Sat, 31 Mar 2012 12:15:16 +0800</pubDate><description><![CDATA[思路：模拟。以钟表中心建立直角坐标系，根据每根针权重计算出重心，确定长度，并根据当前时间确定每根针的角度，计算出相应的x，y坐标，这样每一秒的距离都计算出来了
#include 
#include 
#include 
#include 
#include 
using namespace std;

const double PI = acos(-1.0);
int l1, l2, l3, m]]></description><category></category></item><item><title><![CDATA[hdoj Integer’s Power]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7415063</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7415063</guid><author>Terry__J</author><pubDate>Sat, 31 Mar 2012 12:08:28 +0800</pubDate><description><![CDATA[来源：2009
 Shanghai Invitation Contest Host by DHU
思路：sum[a, b] = sum[2, b] - sum[2,a-1].
枚举指数i，计算出在区间内可以表示成p^i的个数。值得注意的是若在区间[2， 64]内，i = 2时，a[2] = 7(2,3,4,5,6,7,8),其中4，8不应包含在内，因为4^2= 2^4,8^2=2^6,所以在]]></description><category></category></item><item><title><![CDATA[poj 1186 哈希表构造]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7408766</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7408766</guid><author>Terry__J</author><pubDate>Thu, 29 Mar 2012 20:45:17 +0800</pubDate><description><![CDATA[思路：题目给定最多6元方程，每个解的范围给定了[1, 150]，若n=6，直接枚举肯定超时 ，我们可以枚举出前三个解产生的值s1，存入表中。利用哈希表，由于x的取值范围是[1,150],三个解最多产生150*150*150种可能，这样就确定了哈希表的大小。再枚举后三个解产生的值s2，若s2 =s1,则说明这是一个解。
#include 
#include 
#include 
#include]]></description><category></category></item><item><title><![CDATA[poj 2484 博弈]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7404832</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7404832</guid><author>Terry__J</author><pubDate>Wed, 28 Mar 2012 21:47:34 +0800</pubDate><description><![CDATA[思路：当n=1||n=2时，Alice必胜，当n>2时，Bob都有必胜的策略。当n为偶数时，Bob选取与Alice相同的硬币数，且与Alice中心对称即可；若n为奇数，Bob只在第一次选取与Alice不通数目的硬币，其他次相同，仍是中心对称即可。
#include 
#include 
#include 

using namespace std;

int main()
{
    int n]]></description><category></category></item><item><title><![CDATA[poj 2480]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7403923</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7403923</guid><author>Terry__J</author><pubDate>Wed, 28 Mar 2012 17:56:49 +0800</pubDate><description><![CDATA[设函数g(n) = gcd(i,n) (11时 n=p1^a1*p2^a2*...*ps^as，那么f(n)是积性函数的充要条件是f(1)=1，及f(n) = f(p1^a1)*f(p2^a2)*...f(pr^ar)。所以只要求f(pi^ai)就好，如果d是n的一个约数，那么1<=i<=n中gcd(i,n)
 = d的个数是phi(n/d)，即n/d的欧拉函数
f(pi^ai) =  Φ（p]]></description><category></category></item><item><title><![CDATA[hdoj 1695 GCD]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7400410</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7400410</guid><author>Terry__J</author><pubDate>Tue, 27 Mar 2012 20:51:09 +0800</pubDate><description><![CDATA[思路：由题意可知求gcd(i, j) = k 满足i属于区间[a,b],j属于区间[c, d]. 进而转化成求gcd(i/k, j/k) = 1 满足i属于区间[1, b/k],j属于区间[1, d/k].即求两区间内互素数的对数有多少。
欧拉函数可求出所有小于等于n并且与n互素的数的个数。假设b
#include 
#include 
#include 
#include 
#include]]></description><category></category></item><item><title><![CDATA[阶乘最后非零位 模板]]></title><link>https://blog.youkuaiyun.com/Terry__J/article/details/7398435</link><guid>https://blog.youkuaiyun.com/Terry__J/article/details/7398435</guid><author>Terry__J</author><pubDate>Tue, 27 Mar 2012 12:50:00 +0800</pubDate><description><![CDATA[#include 

using namespace std;

#define MAXN 10000
char c[MAXN];
int lastdigit(char* buf){

	const int mod[20]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2};
	int len=strlen(buf),a[MAXN],i,c,ret=1;

	if]]></description><category></category></item></channel></rss>