摘要: 文章链接: http://258go.5d6d.com/thread-13-1-1.html初识ACM最早听说ACM/ICPC这项赛事是在大三上的算法课上张老师提到的,当时我们学校的组织参加这项活动才刚刚起步,我也没太在意,总觉得那是非常遥远的事,事实上当时我也从未相当如今我们能获得现在的成绩。真正踏入ACM/ICPC这个神奇的世界,不得不提到2004那一年我们学校的参赛队伍xmutank,正是听了pipo师兄的精彩演讲以后我才对这项赛事充满兴趣,真正开始充满挑战的ACM之旅。第一真正的训练是从2004的寒假开始,也许不能说是训练而应该称之为“玩”, 事实上我一直喜欢把做题称之为“玩ACM”, 阅读全文
posted @ 2011-08-20 00:57 追逐. 阅读(333) 评论(0) 推荐(0) 编辑
摘要: 贪心算法概念 贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。用贪心法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题, 通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯。 贪心算法是一种改进了的分级处理方法。其核心是根据题意选取一种量度标准,然后将这多个输入排成这种量度标准所要求 阅读全文
posted @ 2011-08-17 16:06 追逐. 阅读(343) 评论(0) 推荐(0) 编辑
摘要: 1、 堆排序定义 n个关键字序列Kl,K2,…,Kn称为堆,当且仅当该序列满足如下性质(简称为堆性质): (1) ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤n ) 若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。2、大根堆和小根堆 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆。 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆。 注意: ①堆中任一子树亦是堆。 ②以上讨论的堆实 阅读全文
posted @ 2011-08-17 15:24 追逐. 阅读(1200) 评论(0) 推荐(0) 编辑
摘要: 题目: 有n件重量不同的物品,现要求耗费最少的体力将它们合并成一堆。每一次合并可以把两堆物品合并成一堆,消耗的体力等于两堆物品的重量之和。输入:第一行输入物品个数n,以下n行依次输入各物品重量。输出: 输出耗费的最小体力。 用堆排序每次将两个权值最小的结点取出,从结点集中删除并将合并后的结点加入节点集合,合并后的结点权值为这两个被删除结点的权值之和,累加新结点的权值。重复计算直到只剩随后一个结点为止,最后所累加的权值和即为所求解。#include<iostream>using namespace std ;int a[100] ;void heap(int s, int n){ / 阅读全文
posted @ 2011-08-17 15:05 追逐. 阅读(584) 评论(0) 推荐(0) 编辑
摘要: 输入: 第一行输入一个整数N,代表要排序元素的个数 以下N行输入N个要排序的元素输出: 从小到大依次输出各元素#include<iostream>using namespace std ;int a[100] ;void heap(int s, int n){ //调整堆,使其始终为小根堆 int i, j = 1, k = a[s], max = 0 ; while(j!=max){ i = a[s] ; j = max ; if(2*s<=n) if(a[s*2]<i){ i = a[s*2] ; j = s * 2 ; } if(s*2+1<=n) if(a 阅读全文
posted @ 2011-08-17 14:56 追逐. 阅读(2401) 评论(0) 推荐(0) 编辑
摘要: 题意: 给定船的最大载重量和旅客人数,以及每个旅客的体重,每条船最多坐两人,求让每个旅客都上船所需船数量的最小值。 由于旅客体重范围较小,可直接遍历所有可能的体重,省去了对旅客体重值的排序。用一个数组记录每个体重旅客的人数,根据较轻体重的旅客与较重体重旅客的最佳搭配得到最优解。代码:#include<iostream>#include<cstring>using namespace std ;int main(){ int a[300] ; int m, n, i, j ; cin >> m >> n ; memset(a, 0, sizeof( 阅读全文
posted @ 2011-08-14 12:36 追逐. 阅读(615) 评论(0) 推荐(1) 编辑
摘要: 题意: 有N个任务,每个任务都花费一个单位的时间来完成,每个任务都有规定的时间期限,超出期限完成则要罚款。求所能使罚款最小的任务组合及最小罚款金额。 输入: 一个整数N代表任务个数,下面N行分别有两个整数,第一个为时间期限,第二个为超时罚款金额。输出: 期限内完成的任务编号,期限外完成任务编号,罚款数。 本题关键在罚款金额,所以要尽可能的使罚款金额大的任务先完成,对任务根据罚款金额从大到小排序,依次处理各个任务。得到可提前完成的任务后,对任务根据时间期限排序,使期限大的任务尽可能的靠后,这样能保证提前完成的任务数量最大。代码:#include<iostream>#include&l 阅读全文
posted @ 2011-08-14 12:36 追逐. 阅读(780) 评论(0) 推荐(0) 编辑
摘要: DescriptionBackground "KO-RE-A, KO-RE-A" shout 54.000 happy football fans after their team has reached the semifinals of the FIFA World Cup in their home country. But although their excitement is real, the Korean people are still very organized by nature. For example, they have organized h 阅读全文
posted @ 2011-08-14 12:35 追逐. 阅读(338) 评论(0) 推荐(0) 编辑
摘要: 题意: 随意给定一串数字1,2,3,求最少多少次交换操作可以将其按升序排列,输出最少次数以及每次交换的位置。代码:#include<iostream>#include<cstring>using namespace std ;int min(int a, int b){ if(a>b) return b ; else return a ;}int main(){ int n, i, j ; int a[1001], b[1001], s[4][4] ; cin >> n ; int num[4] ; int sum, key ; memset(num, 阅读全文
posted @ 2011-08-14 12:35 追逐. 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 题意: 给定两个字符串,求经过多少次的增删改操作可使两个字符串相同。与poj2192相似,用dp[n]记录使str1前n个字符与str2前m个字符相同的最少操作数。每次的判断都有三种情况,即str1前i个字符str2前j-1个字符,str1前i-1个字符str2前j个字符,str1前i-1个字符str2前j-1个字符。取三种情况经过本次操作后的最小值即可。 代码:#include<iostream>#include<cstring>usingnamespacestd;intmin(inta,intb,intc){intm=1000000;if(a<m)m=a;if 阅读全文
posted @ 2011-08-14 12:34 追逐. 阅读(206) 评论(0) 推荐(0) 编辑