08 2013 档案
摘要:题目链接:http://codeforces.com/problemset/problem/340/A这道题目理解不难,就是在[a, b]区间内,找出同时能够被x和y整除的个数。第一次想当然的开了两个2·109的数组,分别标记能被x和y的数字,内存受不了,返回CE。仔细想了下,开这么大的一个数组没有必要,直接在[a, b]枚举每一个数,能够同时整除x和y的数就统计下来,过了PT,然而很快就被hacked(还是第一次遇到的= =,不过也好,能帮助养成严谨的思维); 第三次,稍稍改良了算法,求x和y的最小公倍数,在[a, b]的范围内累加最小公倍数的个数,直到大于b为止,然而没考虑到最小
阅读全文
摘要:题目链接:http://codeforces.com/problemset/problem/339/B题目理解不难,这句是解题的关键 In order to complete the i-th task, she needs to be in the house number ai and complete all tasks with numbers less than i 。从样例1的提示,可以知道,如果a[i]> a[i+1],则需要继续顺时针走下去,直到到达n,接着重新从1开始数,直到a[i+1]。 这里要注意的是题目中2 ≤ n ≤ 105, 1 ≤ m ≤ 105 ,暗示了我
阅读全文
摘要:题目链接:http://codeforces.com/problemset/problem/336/C题目意思:给出一个递增的正整数序列 a1, a2, ..., an,要求从中选出一堆数b1, b2, ..., bk,这堆数进行完按位&运算之后(b1 and b2 and ... and bk),能被2v整除。除此,还要求所选中的这堆数是两两不同的,&之后要最大,换句话来说,v 要尽可能最大,如果找到最大的v的方法有多种,即在 a1, a2, ..., an 中有很多种不同的组合 & 完后能求得最大的v,则挑中的这堆数要尽可能最多。如果得到最多的数还是有多种,只需要写
阅读全文
摘要:题目链接:http://codeforces.com/problemset/problem/337/B看到这个题目,觉得特别有意思,因为有熟悉的图片(看过的一部电影)。接着让我很意外的是,在纸上比划了一下,凭着直觉,竟然一次AC,那个兴奋啊 !^_^ ! 好啦,不说废话。 这个题目被分类为 math 和 matrices ,数学还好理解,matrices,应该是母函数吧(不好意思的说,还没系统地学到),姑且让我分类到数学里吧。题目的意思是,给出一个水平长度 : 垂直长度的比例分别为a:b 的 monitor 屏幕和 c:d 的 movie 框架,要求算出 movie 框架嵌入monitor屏幕
阅读全文
摘要:题目链接:http://codeforces.com/problemset/problem/337/A题意:有n个学生,m块puzzles,选出n块puzzles,但是需要满足这n块puzzles里的最大pieces(A)和最小pieces(B)之差最少,即the least possible difference。这是一道贪心兼排序的题目,解决方法不难。首先对m块puzzles以非递减的顺序排序(可以保证每个n长度的区间difference最小),接着求出所有长度为n的区间中最大和最小的值之差,即代码中a[i+n-1] - a[i] ,最后选出最小的差就是题目的答案。 1 #include
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 第二条并查集,和畅通工程的解法类似。判断小希的迷宫不符合条件,即有回路。我的做法是,在合并两个集合的时候,当fx = fy,即有共同祖先的时候,说明就有回路。 这题有三点要注意:1、格式问题。题目说的“每两组数据之间有一个空行。”是会PE的!!实际上输出Yes或No之后加多个\n即可,不需要再画蛇添足再输多一个换行。 2、当整数对列表只有0 0 时,要输出Yes 3、当不相交的集合个数>=2时,也是不符合条件的,要输出No 1 #include 2 #include 3 #includ
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 并查集入门题。最近在学并查集,它无非包括三个操作:make_set(x)、union_set(x, y)和find_set(x)。make_set(x)的作用是使得每一个成员x自成一个只包含x的集合。union_set(x, y)的作用是使x和y合并成为一个新的集合,确定x和y的连通性。 find_set(x)则是查找到x的祖先,这里用set[i]表示元素 i 的祖先,换句话说就是,包含x的集合(唯一)的代表,当然这个代表是集合中的某个成员。对于如何选择代表要具体问题具体分析,但是要注意,如
阅读全文
摘要:题目链接:http://codeforces.com/problemset/problem/336/A 好简单的一条数学题,是8月9日的。比赛中没有做出来,今天看,从pupil变成Newbie了,那个伤心啊~~~~不是分数的缘故,而是心态!!!昨晚一直卡机,网页很久才打得开,35min才进入比赛页面,接着做的时候又非常浮躁,静不下心来,提交时再次卡机,临20多min才提交成功,于是罢想!!心态真不好!!!这是第一次做题做得那么糟糕,要端正心态才行,遇到什么紧急情况都要冷静,保持清醒的头脑。 题意不难,以原点、X轴和Y轴各取一点,围成一个等腰直角三角形。当然,过X轴和Y轴的点的那条线段(假设是y
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1050这道题目隔了很久才做出来的。一开始把判断走廊有重叠的算法都想错了。以为重叠只要满足,下一次moving的起始room小于或等于上一次moving的结束room则证明有重复。这样只能保证局部不能同时进行moving,但是根本得不出其他moving哪些是可以同时进行搬动的。 正确的思路是,统计最大的重叠数,再乘以10即可。具体做法:把每个房间之间的走廊作为一个统计单位,当所有的办公桌都搬运完成之后,看看这段走廊到底需要占用多少次,然后统计所有的走廊被占用的最大值max,这个值就是要单独安排的搬运次
阅读全文
摘要:题目链接:http://poj.org/problem?id=1007 本题属于字符串排序问题。思路很简单,把每行的字符串和该行字符串统计出的字母逆序的总和看成一个结构体。最后把全部行按照这个总和从小到大排序即可。 1 #include 2 #include 3 using namespace std; 4 5 struct DNA 6 { 7 char s[100]; 8 int count; 9 } d[100];10 11 int cmp(DNA a, DNA b)12 {13 return a.count > n >> m)20 {21 ...
阅读全文
摘要:题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1654题意:简单的理解就是,把一个序列中相邻的且是偶数个相同的字符删除,奇数个的话就只保留一个。但是要注意,删除的过程中,可能会导致本来不相邻的相同字符变得相邻了,这时候也要删除。如果直接暴力:每次查看串中是否有相同的相邻字母,如果有就删去,然后继续从前向后查找,这样肯定会超时(O(N^2))。 优化的方法,利用栈的特殊结构O(N),从左向右扫描,判断当前的字符和栈顶元素是否相同,如果相同栈顶元素出栈,否则的话将这一位的元素入栈,这样线性地扫描一遍后,栈中的元素就是剩下的串。要注意输出
阅读全文
摘要:题目链接:http://codeforces.com/problemset/problem/328/A 一开始单纯地直接判断给出的序列是等差还是等比,连这一句“You should also print 42 if the next element of progression is not integer” 都直接忽略,因为 Output 中没说,只是描述里讲了(要积累经验啊!!),其实是大错特错!这个题目的关键是,当判断出给定的序列是等比时,求出下一个数(假设为result)是否是小数的判断(等差就没有这个问题,因为都是整数)。这里我采取的办法是把浮点型的result(用来保存待求的下一个
阅读全文
摘要:题目链接:http://poj.org/problem?id=2013 设长度非递减的字串序列为s[1]...s[n]。设计递归子程序print(n),其中n为字串序号,每分析1个字串,n=n-1。 n = 0 为边界。字串s为局部变量: 先输入和输出当前组的第1个字串s,n = n - 1;若n > 0,则输入当前组的第2个字符s,n = n - 1。若n > 0,则通过递归调用print(n)将字串s入栈。回溯过程相当于栈顶字串s出栈,因此直接输出s。 1 #include 2 #include 3 using namespace std; 4 5 void print(int
阅读全文
摘要:题目链接:http://poj.org/problem?id=2739 预处理出所有10001以内的素数,按照递增顺序存入数组prime[1...total]。然后依次处理每个测试数据。采用双重循环计算n的表示数: 外循环i :for (i = 0; x >= prime[i]; i++) 的循环结构枚举所有可能的最小素数prime[i]; 内循环:while (ans =x。若ans = n,则连续素数的和的表示数为sum++,继续外循环。外循环结束后得出的sum即为问题的解。 1 #include 2 using namespace std; 3 4 const int Maxn =
阅读全文
摘要:题目链接:http://poj.org/problem?id=3080该题属于字符串处理中的串模式匹配问题。题目要求我们:给出一个DNA碱基序列,输出最长的相同的碱基子序列。(保证在所有的序列中都有出现) 这里采用了Brute Force算法(由于碱基序列的串长仅为60,规模比较小),这是模式匹配的一种最简单的做法。 设: 最长公共字串为ans,其长度为maxlen。 m个碱基序列为p[0]...p[m-1]。由于公共子序列是每个碱基序列的子串,因此不妨枚举p[0]的每一个可能的子串s。以s为模式,分别以p[1]...p[m-1]为目标进行匹配计算: 若s为p[1]...p[m-1]的...
阅读全文