09 2013 档案

摘要:题目链接:http://codeforces.com/problemset/problem/349/A题目意思:题目不难理解,从一开始什么钱都没有的情况下,要向每一个人售票,每张票价格是25卢布,这些人只可能拥有100,50,25的其中一张卢布。问:售票员是否能在可以找赎的情况下,向每一个人都售到票。 此题被贴上贪心的标签,但我觉得更像模拟题。用了比较笨的方法来解决,但是毕竟是自己编的,还是比较有感觉。要特别注意,收了别人的钱,相应的面额数量要作相应的改动。例如第一个样例的25 25 50 50,当处理到第三个人的50时,25卢比这个面值只剩下1了,原因是要找给第三个人25卢比,而本来没有50 阅读全文
posted @ 2013-09-28 10:52 windysai 阅读(417) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1425 常规的方法是对输入的数从大到小进行排序(可以用sort或qsort),然后输出前m大的数。 不过此题实质上是hash的入门题。建立一个比较大的数组,然后把这些数通过hash函数计算映射到这个数组里面(这里hash函数是 tmp + 500000,tmp是输入的n个数中任意的一个数),考虑到这些数是各不相同的,因此不需要考虑冲突问题。 1 #include 2 #include 3 using namespace std; 4 5 const int maxn = 1e6 + 5; 6 ... 阅读全文
posted @ 2013-09-23 15:00 windysai 阅读(335) 评论(0) 推荐(1)
摘要:题目链接:http://code.hdu.edu.cn/game/entry/problem/show.php?chapterid=1&sectionid=2&problemid=22题目意思:给出一个数,观察其二进制表示,从右往左看,记录遇到第一个出现1的位置pos,做2 ^ pos 的运算。 这几天杭电的告示:Exercise Is Closed Now! 再加上想用一些简单的题目来调剂一下,因此就做ACM Steps 吧。 用了递归的方法来做。 1 #include 2 #include // pow库函数的使用 3 using namespace std; 4 5 in 阅读全文
posted @ 2013-09-22 23:18 windysai 阅读(454) 评论(0) 推荐(1)
摘要:题目链接:http://codeforces.com/problemset/problem/347/A题目意思:给出一个序列 a1, a2, ..., an , 通过重排序列,假设变成x1, x2, ..., xn ,使得 (x1 - x2) + (x2 - x3) + ... + (xn - 1 - xn) 的和最大。输出这个重排后的序列,不过这个序列在满足得到这个最大和的基础上字典序的排序是最小的。字典序排列即:Sequence x1, x2, ... , xp is lexicographically smaller than sequence y1, y2, ... , yp if t 阅读全文
posted @ 2013-09-21 09:44 windysai 阅读(239) 评论(0) 推荐(0)
摘要:题目链接:http://codeforces.com/problemset/problem/347/B题目意思:给出一个包含n个数的排列a,在排列a中最多只能作一次交换,使得ai = i 这样的匹配达到最多。作一次交换,最理想的情况是,在原来匹配好的序列中再匹配到两个数;最坏的情况是,即使作怎样的交换,都不可能再找到可以匹配的两个数,也就是说,根本不需要作交换。至于一般情况下,是可以再匹配到一个数的。 我是设了两个数组(分别有n个数):a(用来存储待判断的序列a)和b(依次存储0~n-1个数)。然后判断a[i]与b[i]是否相等,这是为了确定未作交换前两组序列本来能够匹配的数目;如果不符合就尝 阅读全文
posted @ 2013-09-21 09:19 windysai 阅读(260) 评论(0) 推荐(0)
摘要:题目链接:http://codeforces.com/problemset/problem/344/B题目意思:这句话是解题的关键:The number of bonds of an atom in the molecule must be equal to its valence number。 给定三个原子的化学价,规定化学价数等于该原子与另外两个原子所连接的原子键之和。又一次把简单问题复杂化了.....(以下注释部分读者可以忽略) /* 一开始三重循环枚举,绝对超时(10^6 * 10^6 * 10^6),不敢提交!!后来甚至想到这三个原子构成的原子键与总的化学价数成两倍关系(貌似没什么 阅读全文
posted @ 2013-09-17 10:23 windysai 阅读(342) 评论(0) 推荐(0)
摘要:题目链接:http://code.hdu.edu.cn/showproblem.php?pid=1879 这条题目我的做法与解决Constructing Roads的解法是相同的。 0 表示没有连通;1代表已连通。在已连通村庄的道路的基础上,找到扩展出来的最小生成树。 1 #include 2 #include 3 using namespace std; 4 5 const int maxe = 10000 + 10; 6 int rep[maxe], vis[maxe]; 7 8 struct sets 9 {10 int v1, v2;11 int value;1... 阅读全文
posted @ 2013-09-11 23:54 windysai 阅读(220) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=2421实际上又是考最小生成树的内容,也是用到kruskal算法。但稍稍有点不同的是,给出一些已连接的边,要在这些边存在的情况下,拓展出最小生成树来。 一般来说,过到这四组数据大体上就能AC了。 1、题目给出的案例数据 2、连接的道路可能把所有的村庄都已经连通了 3、两个村庄给出多次,即连接这两个村庄的道路是重复的!。2、3这两种情况的数据如下(为了好看,自己出了一组,当然Sample Input 那组也行):情况2(所有村庄已连通): 情况3: 还有第4种情况: 1 #include 2 #include 3 using... 阅读全文
posted @ 2013-09-11 07:48 windysai 阅读(290) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=3750 约瑟夫问题,直接模拟即可。 1 #include 2 #include 3 using namespace std; 4 5 const int maxn = 65; 6 7 int main() 8 { 9 char ch;10 int i, n, w, s, num[maxn];11 string per[maxn];12 while (scanf("%d", &n) != EOF)13 {14 for (i = 0; i > per[i]; // 保... 阅读全文
posted @ 2013-09-08 22:55 windysai 阅读(376) 评论(0) 推荐(0)
摘要:题目链接:http://code.hdu.edu.cn/showproblem.php?pid=1233并查集的运用, 实质就是求最小生成树。先对所有的村庄距离从小到大排序,然后判断村庄之间是否属于同一集合,不是则将距离相加。属于同一集合,说明村庄连成了环,就不符合树的定义了。这样扫描下来,就求得最小生成树了。 要特别注意的是,数组越界问题。这个得益于Dwylkz的指点。由于村庄最多假设为100,为了防止边数越界,数组应该开到100 * 100 (10000)左右。 1 #include 2 #include 3 using namespace std; 4 5 const int ma... 阅读全文
posted @ 2013-09-08 12:00 windysai 阅读(181) 评论(0) 推荐(0)
摘要:题目链接:http://codeforces.com/problemset/problem/342/A题目意思:给出n个数,找出n/3个组且每组有3个数,这三个数必须要符合两个条件:1、a = s[4],否则对于类似1 3 4 的数据是过不了的!!!! 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int maxn = 99999 + 5; 8 int s[maxn]; 9 10 int main()11 {12 int n, i, flag, temp;13 ... 阅读全文
posted @ 2013-09-07 23:23 windysai 阅读(311) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 有关系(直接或间接均可)的人就坐在一张桌子,我们要统计的是最少需要的桌子数。并查集的入门题,什么优化都无用到就可以直接过。实质上就是统计总共有多少个不相交的集合。比较可恶的是,题目中 There will be a blank line between two cases 是骗人的!!! 1 #include 2 using namespace std; 3 4 const int maxn = 1000 + 5; 5 int p[maxn], rank[maxn]; 6 7 int ... 阅读全文
posted @ 2013-09-07 20:04 windysai 阅读(226) 评论(0) 推荐(0)
摘要:题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=19&page=show_problem&problem=1645题意:题目实质要我们求的是使集合连成环的所有pairs数。可以把每个元素看成顶点,则构成一个简单化合物就在两个元素间连成一条边。当整个图存在环的时候,组成环的边对应的化合物是危险的,反之就是安全的。 这样,我们可以用一个并查集来维护图的连通分量集合,每次得到一个简单化合物(x, y)时就检查x和y是否在同一集合中。如果 阅读全文
posted @ 2013-09-05 09:26 windysai 阅读(255) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=2524实质上就是算经过所有的连边后,共有多少个不相交的集合。 我采取的方法和解决1611 The suspects的方法是相同的。读者可以参考下。这里只讨论经过两次merge处理之后,怎样统计不相交集合的个数。先用sort将所有元素的祖... 阅读全文
posted @ 2013-09-03 23:25 windysai 阅读(212) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1611题意:给定n个人和m个群,接下来是m行,每行给出该群内的人数以及这些人所对应的编号。需要统计出跟编号0的人有直接或间接关系的人数总共有多少。 这又是一条并查集的应用。难点是如何统计出与0有关系的总人数,即包含0的集合内元素的总个数。我的方法是用了两次merge,第一次merge单纯地将同一群内的元素连边,当然该群内的元素的祖先有可能是别的群内的元素,连边的规则是大的元素指向小的元素;第二次merge则把第一次筛选出来的集合中将元素与它的祖先再合并。目的是为了每一个集合内的元素都指向同一个代表。 以第一个数据测试来说,第二行的 阅读全文
posted @ 2013-09-03 15:29 windysai 阅读(317) 评论(0) 推荐(0)