08 2013 档案

摘要:题目大意:给出一些原料和价钱和若干份菜谱,每份菜谱都标明所需的原料和数量,找出所有不超过预算的菜谱。 没什么好说的,主要是对map的运用。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 typedef map msi; 9 10 struct Recipe11 {12 string name;13 int cost;14 bool operator > T;28 getchar();29 msi ing... 阅读全文
posted @ 2013-08-31 21:41 xiaobaibuhei 阅读(323) 评论(0) 推荐(0)
摘要:题目大意:给一个中缀表达式,转换成后缀表达式。 这类题一直不太会,让我想就是建一棵表达式树,然后后续遍历算了,可是建树的过程实在太麻烦了。今天才看到有中缀表达式转换成后缀表达式的算法,可以用栈进行实现,我现在才知道...算法如下: 这里假定操作数均为一位数字,操作符只有(、)、+、-、*和/,结果保存到postfix数组里,还要用到一个栈来保存运算符。 从左向右扫描表达式,如果当前字符为: (1)数字,将该数字添加到postfix末尾。 (2)(,将(压入栈中。 (3)),如果当前栈顶元算不是(,将栈中的运算符逐个弹出并追加到postfix末尾,知道栈顶为(,弹出但不追加。 ... 阅读全文
posted @ 2013-08-31 17:41 xiaobaibuhei 阅读(485) 评论(0) 推荐(0)
摘要:题目大意:给一个有n个数的序列,通过交换相邻的逆序数使这个序列最终有序,求需要交换的次数。 本来可以用冒泡排序解决,但是n达到105,用冒泡排序会超时,用O(nlogn)的归并排序可以达到要求。《算法竞赛入门经典》第八章的“逆序对数”有详细介绍。 1 #include 2 #define MAXN 100000+10 3 4 int a[MAXN], tmp[MAXN]; 5 int cnt; 6 7 void merge_sort(int l, int r) 8 { 9 if (r-l == 1) return;10 int mid = l + (r-l)/2;... 阅读全文
posted @ 2013-08-31 15:02 xiaobaibuhei 阅读(268) 评论(0) 推荐(0)
摘要:题目大意:给n个数的一个序列,通过交换相邻的两个数使得这n个数按照从小到大的顺序排列。 Inversion index problem: count how many swaps are needed to make the list sorted. 使用冒泡排序解决。 1 #include 2 3 int main() 4 { 5 #ifdef LOCAL 6 freopen("in", "r", stdin); 7 #endif 8 int T; 9 scanf("%d", &T);10 int a[60];11 whil 阅读全文
posted @ 2013-08-31 13:02 xiaobaibuhei 阅读(224) 评论(0) 推荐(0)
摘要:题目大意:给若干个球队和比赛结果,按照给定的规则给球队排名。 多关键字域排序,题目不难,只是太繁琐,注意在按名字排名时是大小写不敏感的,在这里WA了一次... 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 7 struct Team 8 { 9 char name[35], tname[35]; 10 int point, game, win, tie, loss, diff, scored, against; 11 bool operator ... 阅读全文
posted @ 2013-08-30 21:26 xiaobaibuhei 阅读(350) 评论(0) 推荐(0)
摘要:题目大意:给一个由字母构成的序列,输出按字典序的下一个排列。 用c++ STL的next_permutation可以很容易地解决。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 int main() 7 { 8 #ifdef LOCAL 9 freopen("in", "r", stdin);10 #endif11 char str[60];12 while (gets(str) && str[0] != '#')13 {14 if (next_pe 阅读全文
posted @ 2013-08-30 19:35 xiaobaibuhei 阅读(196) 评论(0) 推荐(0)
摘要:题目大意:大小端模式的转换。所谓的小端模式,是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中。与此相对,所谓的大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中。以字节为单位,将整数的高低位进行交换即可,可以使用。 1 #include 2 #include 3 using namespace std; 4 5 int main() 6 { 7 #ifdef LOCAL 8 freopen("in", "r", stdin); 9 #endif10 int n;11 unsigned int un;12 阅读全文
posted @ 2013-08-30 19:13 xiaobaibuhei 阅读(396) 评论(0) 推荐(0)
摘要:题目大意:报社根据文章中不同字符的价值付费给作者,给出字符的价值,计算一篇文章应付多少钱给作者。 先统计文章中每个字符出现的次数,再计算价值。直接寻址表(Direct Addressing Table, DAT)的应用。 1 #include 2 #include 3 #define MAXN 256+4 4 #define LINEN 10000+10 5 6 int cnt[MAXN], value[MAXN]; 7 8 int main() 9 {10 #ifdef LOCAL11 freopen("in", "r", stdin);12 #end 阅读全文
posted @ 2013-08-29 17:09 xiaobaibuhei 阅读(210) 评论(0) 推荐(0)
摘要:题目大意:引用Worlf of Seven的描述,What the problem wants is: 3 1 2 32.0 54.7 -2 54.7 is the 1st position in array -2 is the 2nd position in array 32.0 is on the 3rd position in array 直接进行转化就好了,还有就是题目要求浮点数的输出和输入形式一样,所以浮点数用字符串存储就好了。 1 #include 2 #include 3 #include 4 #include 5 u... 阅读全文
posted @ 2013-08-29 15:29 xiaobaibuhei 阅读(243) 评论(0) 推荐(0)
摘要:题目大意:有一个1025*1025的矩阵,每个矩阵元素保存这个点上老鼠的数量。现有一种气体炸弹,能覆盖“半径”为d的矩形,在这个范围内可以消灭所有的老鼠,让你找出合适的放置炸弹的位置使的消灭的老鼠数量最多。 如果暴力枚举的话会超时,考虑到题中有老鼠的点不超过20000个,可以用m[i][j]保存将炸弹放到第i行第j列时消灭老鼠的数量(初始化为0),当某个点有老鼠时更新“半径”为d范围内的m值(加上该点的老鼠数量),这样可以减小时间复杂度。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define MAXN 1... 阅读全文
posted @ 2013-08-28 22:04 xiaobaibuhei 阅读(201) 评论(0) 推荐(0)
摘要:题目大意:知道一场橄榄球比赛比分的和以及差的绝对值,算出这两个数。注意判断结果的可能性(比分为非负数)。 1 #include 2 3 int main() 4 { 5 #ifdef LOCAL 6 freopen("in", "r", stdin); 7 #endif 8 int n; 9 scanf("%d", &n);10 int s, d, a, b;11 while (n--)12 {13 scanf("%d%d", &s, &d);14 if (s < d || (s+d) 阅读全文
posted @ 2013-08-28 20:22 xiaobaibuhei 阅读(188) 评论(0) 推荐(0)
摘要:题目大意:有n个人,给出每个人的国籍,统计每个国家的人数。 用map做的。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 2000+10 8 9 map m;10 string str[MAXN];11 12 int main()13 {14 #ifdef LOCAL15 freopen("in", "r", stdin);16 #endif17 int n;18 scanf("%d", & 阅读全文
posted @ 2013-08-28 20:04 xiaobaibuhei 阅读(267) 评论(0) 推荐(0)
摘要:题目大意:有一只蜗牛位于深一个深度为h米的井底,它白天向上爬u米,晚上向下滑d米,由于疲劳原因,蜗牛白天爬的高度会比上一天少f%(总是相对于第一天),如果白天爬的高度小于0,那么这天它就不再向上爬,问这只蜗牛在几天爬出井口或滑下井底。 很直接的题,就是纠结于当蜗牛白天不爬的时候,下一天它是继续不爬还是向上爬u米,这个题的意思应该是以后白天都不再向上爬。还有就是注意边界,成功(>h)和失败( 2 3 int main() 4 { 5 #ifdef LOCAL 6 freopen("in", "r", stdin); 7 #endif 8 int he 阅读全文
posted @ 2013-08-28 17:40 xiaobaibuhei 阅读(219) 评论(0) 推荐(0)
摘要:题目大意:也是硬币兑换问题,与147、674用同样的方法即可解决。 1 #include 2 #include 3 #define MAXN 30001 4 5 const int coin[5] = {1, 5, 10, 25, 50}; 6 long long dp[MAXN]; 7 8 int main() 9 {10 #ifdef LOCALi11 freopen("in", "r", stdin);12 #endif13 memset(dp, 0, sizeof(dp));14 dp[0] = 1;15 for (int k = 0; k .. 阅读全文
posted @ 2013-08-27 15:34 xiaobaibuhei 阅读(163) 评论(0) 推荐(0)
摘要:题目大意:有11种类型的硬币,给一定的数额,计算有多少中不同的硬币兑换方案。 硬币兑换问题,要注意的就是浮点数转化成整数的误差问题。对硬币金额除以5可以减小计算,计算结果要用long long 类型保存。 1 #include 2 #include 3 #define MAXN 6000+10 4 5 const int coin[11] = {1, 2, 4, 10, 20, 40, 100, 200, 400, 1000, 2000}; 6 long long dp[MAXN]; 7 8 int main() 9 {10 #ifdef LOCAL11 freopen(... 阅读全文
posted @ 2013-08-27 15:07 xiaobaibuhei 阅读(152) 评论(0) 推荐(0)
摘要:题目大意:有5中类型的硬币:1分,5分,10分,25分和50分,现在给你一定数额的金钱n(以分为单位),让你计算有多少中方法可以将这个数额的钱换成硬币,不同次序算同一种,如1,1,5和1,5,1算一种。 硬币兑换问题,经典DP。可以dp[i]保存换i数额的硬币兑换方法数,如果用dp[i] += dp[i-coin]的递推公式的话计算出的是考虑顺序的兑换方法数,所以分五次转移,这样就可以避免重复。理解的不是太清楚,个人感觉就是构造时按照大小顺序先后构造,只考虑1,1,5的方案,不会计算1,5,1和5,1,1这样的方案。 1 #include 2 #include 3 #define M... 阅读全文
posted @ 2013-08-27 11:37 xiaobaibuhei 阅读(134) 评论(0) 推荐(0)
摘要:题目大意:有n个历史事件,需要对他们按发生的时间先后进行排名。给出正确的排名顺序和学生排出的顺序,按学生答案中最长的正确相对顺序序列的长度给分,计算学生能得多少分。如正确顺序是1,2,3,4,学生答案为1,3,2,4,学生可得三分(123和134序列均可)。 就是求两个序列的最长公共序列(LCS),经典问题,要注意的就是题中给出的是事件的排名,要转化成排名后的事件序列。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define MAXN 25 6 7 int correct[MAXN], query[MAX... 阅读全文
posted @ 2013-08-26 20:35 xiaobaibuhei 阅读(217) 评论(0) 推荐(0)
摘要:题目大意:给一个表达式,判断两个运算数和结果是否超过int类型的最大值。 可以用double类型进行计算。 1 #include 2 #include 3 4 int main() 5 { 6 #ifdef LOCAL 7 freopen("in", "r", stdin); 8 #endif 9 char str1[300], str2[300], op;10 double a, b;11 while (scanf("%s %c %s", str1, &op, str2) != EOF)12 {13 printf(" 阅读全文
posted @ 2013-08-25 19:40 xiaobaibuhei 阅读(280) 评论(0) 推荐(0)
摘要:题目大意:有一个圆形的蛋糕,圆心位于原点,上面有2n颗草莓,要求切一刀把蛋糕分成相等的两分并且每份上都有n颗草莓,问如何切。 暴力枚举即可。如果想优化,可以用一个vis数组避免重复枚举相同的直线,x+y=0和2x+2y=0是相同的直线。 1 #include 2 #define POINTN 110 3 4 struct Point 5 { 6 int x, y; 7 }; 8 Point point[POINTN]; 9 int n;10 11 bool judge(int A, int B)12 {13 int pos = 0, neg = 0;14 fo... 阅读全文
posted @ 2013-08-25 17:15 xiaobaibuhei 阅读(278) 评论(1) 推荐(0)
摘要:题目大意:果园里的树排列成矩阵,它们的x和y坐标均是1~99的整数。输入若干三角形,依次统计每一个三角形内部和边界上共有多少棵树。 三角形P0P1P2有向面积为A:2A = x0y1 + x2y0 + x1y2 - x2y1 - x0y2 - x1y0。如果三角形的三个顶点呈逆时针排列,那么有向面积为正,如果是顺时针排列,则有向面积为负。假设输入三角形为ABC,待判断点为O,则O在三角形ABC内部或边界上当且仅当SABC = SOAB + SOBC + SOAC。通过对有向面积取绝对值可以避免三个顶点是否是逆时针的判断,同时要注意计算x、y的最大值和最小值时要限制在[1, 99]的范围内... 阅读全文
posted @ 2013-08-25 16:28 xiaobaibuhei 阅读(387) 评论(0) 推荐(0)
摘要:题目大意:Sk表示从1到k的字符序列,如S4为1234,现如今有如下的序列S1S2...Sk,形如1 12 123 1234这样的序列,给一个数n,让你去这个序列第n个位置上的数字。 可以构建出一个Sk序列的表格,然后用一个数组sum[i]记录该序列到i是有几位,这样就可以计算出n位于那个Sx序列中,求得在该序列中的位置,再查表即可。 1 #include 2 #include 3 #include 4 #include 5 #define MAXN 100000 6 7 long long sum[MAXN]; 8 char str[1000000]; 9 int k;10 ... 阅读全文
posted @ 2013-08-25 14:07 xiaobaibuhei 阅读(338) 评论(0) 推荐(0)
摘要:题目大意:有n个相同的文件,每个文件从中间分为两半,现在给你这2n个文件碎片,求原来完整的文件。 找出文件碎片长度的最大值和最小值,二者相加可得到原来文件的长度len。然后逐个进行拼接,将拼接后长度等于len的加入到map中,最后map中出现次数最多的就是原文件。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define FILEN 150 7 #define SIZEN 256*8+10 8 9 string str[FILEN];10 map m;11 12 int main()... 阅读全文
posted @ 2013-08-24 21:26 xiaobaibuhei 阅读(173) 评论(0) 推荐(0)
摘要:题目大意:给出平面上的n个点,找出距离最近的两个点。 由于n的取值比较大(n 2 #include 3 #include 4 using namespace std; 5 #define MAXN 10000+10 6 7 struct Point 8 { 9 double x, y;10 };11 Point point[MAXN], tmp[MAXN];12 13 bool cmp1(const Point& a, const Point& b)14 {15 if (a.x != b.x) return a.x 10000) printf("INFINIT... 阅读全文
posted @ 2013-08-24 20:03 xiaobaibuhei 阅读(260) 评论(0) 推荐(0)
摘要:题目大意:给出n(n 2 #include 3 #define MAXN 100+10 4 5 long long a[MAXN], target; 6 char op[MAXN]; 7 int n; 8 bool ok, vis[MAXN][32000*2+100]; 9 10 bool judge(int cur, int n)11 {12 return n >= -32000 && n <= 32000 && !vis[cur][n+32000];13 }14 15 void dfs(int cur, long long res)16 {17 阅读全文
posted @ 2013-08-24 16:12 xiaobaibuhei 阅读(182) 评论(0) 推荐(0)
摘要:题目大意:有一个编辑器,它有两种命令,“重复上一个单词” 和 “删除前一个字母”,给出一系列字符串,求最少的敲击键盘的次数。 题目中强调第一个敲的单词必须是给的第一个单词,于是就考虑按照单词与第一个单词的前缀相似度进行排序,可是接下来就...发现网上的方法是直接对所有字符串排序,然后对排序的字符串进行处理,本以为那样输出与题中要求的“Remember that the first word must be pressed first!”不符合,可是提交后竟然AC了!这...而且为什么这么做也想不明白...先放一放吧,下面是按网上方法的代码: 1 #include 2 #include ... 阅读全文
posted @ 2013-08-22 21:25 xiaobaibuhei 阅读(213) 评论(0) 推荐(0)
摘要:题目大意:有m本书,每本书有pi页,把这m本书分给k个人抄写,如何分配才能在最短的时间抄写完这m本书。 最大值最小化问题:把一个包含n个正整数的序列划分成m个连续的子序列,设第i个序列的各数之和为S(i), 使得所有S(i)的最大值尽量小。序列最大值为max,所有数之和为sum,则所求答案必定在[max, sum]之间,通过二分法判断中值mid是否符合条件(把序列分为m份,每份均不超过mid)逐步缩小范围,直至求得解。 其实,我觉得还是看代码来的直接,看书上说的东西半天也不理解说的什么意思,还是研究代码可以一点点地理解。 1 #include 2 #include 3 #inclu... 阅读全文
posted @ 2013-08-22 16:54 xiaobaibuhei 阅读(390) 评论(0) 推荐(0)
摘要:题目大意:给一数N,在区间[L, U]上找到一个数M使得M| N的值最大,如果有M有多个可能值,取最小的那个值。 从最高位开始逐位判断,如果N的该位为0,为使M | N的值最大,M的该位应考虑置为1,然后判断M的该位为1时的可能取值区间[lmin, lmax],如果区间[lmin, lmax]与区间[L, U]有交集,则说明该位可置为1;如果N的该位为1,为使M的值尽可能小,M的该位应考虑置为0,然后判断可能取值区间与[L, U]是否有交集,如果没有交集,该位置为1。 1 #include 2 3 int main() 4 { 5 #ifdef LOCAL 6 freopen... 阅读全文
posted @ 2013-08-21 21:35 xiaobaibuhei 阅读(186) 评论(0) 推荐(0)
摘要:题目大意:有n个包,其中小包可以装到大的包里,包的大小用数字进行表示,求最小的装包数量。 统计每个数字出现的次数,其中次数的最大值k就是最小的装包数量。答案显然不可能比k小,而把相同大小的包装进不同的大包里显然满足条件。题目中有一句话纠结了半天,“While maintaining the minimal number of pieces you are also to minimize the total number of bags in any one piece that must be carried.” 大概是说让每个大包里的小包的数量的最大值最小吧,也就是要把小包尽可能平均... 阅读全文
posted @ 2013-08-21 19:59 xiaobaibuhei 阅读(795) 评论(0) 推荐(0)
摘要:题目大意:给一个字符串,判断是否能通过交换字母构成回文,如果能,计算所需的最小交换次数。 如果字符串中出现奇数次的字母的个数>1,则不能构成回文。然后...就没思路了...看网上说用贪心的思想先从两端开始考虑,决定两端的字母后再缩小问题范围直至字符串长度 2 #include 3 4 int main() 5 { 6 #ifdef LOCAL 7 freopen("in", "r", stdin); 8 #endif 9 int T;10 scanf("%d", &T);11 char str[110];12 while 阅读全文
posted @ 2013-08-21 19:07 xiaobaibuhei 阅读(375) 评论(0) 推荐(0)
摘要:题目大意:判断一个序列是否可图化。Havel-Hakimi定理的简单应用。 在看D_Double's Journey的关于Havel-Hakimi定理时提到这道题,就做了一下。可悲的是,因为一些小细节问题WA了两次,无语... 1 #include 2 #include 3 #include 4 using namespace std; 5 #define MAXN 12 6 7 struct Vertex 8 { 9 int d, id;10 bool operator v.d;13 }14 };15 Vertex vertex[MAXN];16 in... 阅读全文
posted @ 2013-08-19 19:27 xiaobaibuhei 阅读(172) 评论(0) 推荐(0)
摘要:题目大意:给n个整数, 分别代表图中n个顶点的度,判断是否能构成一张图。 看到这个题后,除了所有数之和应该为偶数之外,没有别的想法了,只好在网上搜解题报告了。然后了解了Havel-Hakimi定理。之后的事情就简单了。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 #define MAXN 10000+10 7 8 int a[MAXN]; 9 int n;10 11 bool Havel_Hakimi()12 {13 for (int i = 0; i ());16 if (i ... 阅读全文
posted @ 2013-08-19 18:44 xiaobaibuhei 阅读(217) 评论(0) 推荐(0)
摘要:题目大意:John有h的时间可以去钓鱼,有n湖可钓鱼,以5分钟为时间单位,每个湖初始每个单位时间可钓f条鱼,每下一个时间单位数量减少d条。同时,John只能从1号湖往后走进行钓鱼,湖之间的距离需要t个单位时间。求最多能钓到最多少鱼,并给出方案。 “贪心+暴力,从近至远依次枚举可以到达的钓鱼地点,用总时间减去中途消耗的时间,这样就可以将其当成在各个钓鱼地点之间随意转移(实际题目中给出是单方向前行的),然后在已到达的最远的钓鱼地点之内的所有钓鱼地点上按每次能钓到的鱼的最大值做贪心,若时间用不完,则剩余时间加到第一个钓鱼地点上。注意,钓鱼地点最初的钓鱼值可能为零。” 1 #include 2... 阅读全文
posted @ 2013-08-18 16:56 xiaobaibuhei 阅读(330) 评论(0) 推荐(0)
摘要:题目大意:最大和子序列问题。由于具有最大和的子序列具有一下性质:第一项不为负数,并且从第一项开始累加,中间不会有和出现负数,因为一旦有负数我们可以抛弃前边的部分以得到更大的子序列和,这将会产生矛盾。 1 #include 2 3 int main() 4 { 5 #ifdef LOCAL 6 freopen("in", "r", stdin); 7 #endif 8 int T; 9 scanf("%d", &T);10 for (int kase = 1; kase nicest || (sum == nicest & 阅读全文
posted @ 2013-08-18 14:16 xiaobaibuhei 阅读(162) 评论(0) 推荐(0)
摘要:题目大意:UVa 108 - Maximum Sum的加强版,求最大子矩阵和,不过矩阵是可以循环的,矩阵到结尾时可以循环到开头。开始听纠结的,想着难道要分情况讨论吗?!就去网上搜,看到可以通过补全进行处理,也是,通过补全一个相同的,问题就迎刃而解了,所以把n*n的矩阵扩展成2n*2n的矩阵就好了。 1 #include 2 #include 3 #define MAXN 160 4 5 int a[MAXN][MAXN], sum[MAXN][MAXN]; 6 7 int main() 8 { 9 #ifdef LOCAL10 freopen("in", "r&q 阅读全文
posted @ 2013-08-17 22:33 xiaobaibuhei 阅读(200) 评论(0) 推荐(0)
摘要:题目大意:有一些广告牌,为了使跑步者看到固定数量的广告,设计所需租用的最少数量的广告牌。 其实就是区间选点问题:数轴上有n个区间[ai, bi],取尽量少的点,使得每一个区间都至少有一个点。首先对区间进行排序(按b从小到大的顺序,若b相同则按a从大到小的顺序),然后做出贪心选择:选取第一区间最后一个位置的点,然后逐个区间判断,若已经有点则无需处理,没有点的话选择该区间最后位置的点。本题则是变为k个点,道理是相同的,从后往前进行选点就可以了。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define MAXN ... 阅读全文
posted @ 2013-08-17 21:27 xiaobaibuhei 阅读(325) 评论(0) 推荐(0)
摘要:题目大意:给一个正整数n,构造一个0...n-1的排列,使得这个排列的任何一个长度大于2的子序列都不为等差数列。 把序列按照奇偶位置分成两个序列,这样在两个序列间就不会形成等差数列了,然后再对这两个序列进行分解,直到序列的长度小于3。 刚开始把 arithmetic progression 理解错了,以为是单调序列,后来感觉不对劲,发现原来是等差序列,可是还是不会...只好搜解题思路了,然后根据别人的思路写代码。有时写代码也会碰到困难,不知道该怎么写,就只能再参考别人代码了,这样...唉,不多说了 1 #include 2 #define MAXN 10000+10 3 4 int... 阅读全文
posted @ 2013-08-17 14:24 xiaobaibuhei 阅读(421) 评论(0) 推荐(0)
摘要:题目大意:给一个矩阵,找出一个元素之和最大的子矩阵。 可以暴力枚举,不过是时间复杂度是O(n6),通过利用一个sum数组保存已计算的和可以提高效率(sum[i][j]保存从矩阵左上角到m[i][j]的所有元素和),把时间复杂度降为O(n4),都说这是DP,可是我怎么感觉不出来?对DP理解不够深刻的原因吗? 1 #include 2 #define MAXN 105 3 4 int a[MAXN][MAXN], sum[MAXN][MAXN]; 5 6 int main() 7 { 8 #ifdef LOCAL 9 freopen("in", "r", s 阅读全文
posted @ 2013-08-16 20:53 xiaobaibuhei 阅读(407) 评论(0) 推荐(0)
摘要:题目大意:给出一些点,找到一个位置使这个位置到所有的点的距离的和最短。 很明显,排序,找中位数。关于中位数:有n个从小到大的数,k=(n+1)/2,若n为奇数,k为中位数,若n为偶数,k为中间那两个数中左侧的数。在c语言中,数组以0开始,中位数可以表示为k=(n-1)/2。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define MAXN 500+10 6 7 int a[MAXN]; 8 9 int main()10 {11 #ifdef LOCAL12 freopen("in", "r 阅读全文
posted @ 2013-08-16 19:44 xiaobaibuhei 阅读(334) 评论(0) 推荐(0)
摘要:题目大意:对n份文件进行处理使其减少到m份,有l个机构可供选择。每个机构提供两种方案:每减少一份收费a元,或者减少到文件数量的一半收费b元。根据各个机构收取费用进行排序。 很直接的题目,直接进行模拟就好了。其中对A、B两种方案的选择使用贪心策略。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 100+10 7 8 struct Agency 9 {10 char name[20];11 int cost;12 };13 Agency agency... 阅读全文
posted @ 2013-08-15 16:32 xiaobaibuhei 阅读(203) 评论(0) 推荐(0)
摘要:题目大意:给一个非负整数n,寻找最小的自然数q使得q的各位数字的乘积等于n。 对n进行2~9的因数分解,从9到2循环(分解成9比分解成3,3更小),同时要考虑0和1的特殊情况,除非n是0或1,否则q的各个数字不会有0和1出现。 1 #include 2 #include 3 4 int main() 5 { 6 #ifdef LOCAL 7 freopen("in", "r", stdin); 8 #endif 9 int cnt[10];10 int T;11 scanf("%d", &T);12 while (T--)13 阅读全文
posted @ 2013-08-15 15:07 xiaobaibuhei 阅读(155) 评论(0) 推荐(0)
摘要:题目大意:有一条长为l,宽为w的草坪,在草坪上有n个洒水器,给出洒水器的位置和洒水半径,求能浇灌全部草坪范围的洒水器的最小个数。 经典贪心问题:区间覆盖。用计算几何对洒水器的覆盖范围简单处理一下即可得到每个区间的范围,剩下的就是区间覆盖了。可参考UVa 10020 - Minimal coverage 1 #include 2 #include 3 #include 4 using namespace std; 5 #define MAXN 10000+10 6 7 struct Interval 8 { 9 int pos, r;10 double s, e;1... 阅读全文
posted @ 2013-08-15 13:19 xiaobaibuhei 阅读(274) 评论(0) 推荐(0)
摘要:题目大意:选择不相交区间问题。给定n个区间(a,b),选择尽可能多的区间,是的这些区间两两不相交。 经典贪心问题,将区间按照上界进行排序,选择第一个区间,然后去掉与第一个区间相交的区间,以此类推。 1 #include 2 #include 3 using namespace std; 4 #define MAXN 1000+10 5 6 struct Interval 7 { 8 int l, r, num; 9 bool operator start)34 {35 start = interval[i].... 阅读全文
posted @ 2013-08-14 21:54 xiaobaibuhei 阅读(214) 评论(0) 推荐(0)
摘要:题目大意:走廊两侧有两排房间,现在需要在房间之间移动桌子,走廊的宽度只能容纳一张桌子移动,安排方案使得桌子尽可能并发移动以使得移动的总时间最短。 开始感觉是选择不相交区间问题,就开始写,写着写着就卡壳了,憋不出来了...只好投降了,看书... 将房间之前的走廊作为一个统计单位,当所有的办公室都搬运完成之后,看看这段走廊到底被占用了多少次。统计所有走廊被占用次数的最大值max,这个值就是要单独安排的搬运次数,乘以10就是总的搬运时间。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 int main() 7 ... 阅读全文
posted @ 2013-08-14 21:11 xiaobaibuhei 阅读(327) 评论(0) 推荐(0)
摘要:题目大意:有n个木棍,分别具有长度li和重量wi。对于木棍s1和s2,若l1 2 #include 3 #include 4 using namespace std; 5 #define MAXN 5000+10 6 7 struct Wooden 8 { 9 int l, w;10 bool operator 0)37 {38 time++;39 int prel = -1, prew = -1;40 for (int i = 0; i = prel && wooden[i].... 阅读全文
posted @ 2013-08-14 16:37 xiaobaibuhei 阅读(148) 评论(0) 推荐(0)
摘要:题目大意:有一台主机,有m个cpu和n的内存,有l个任务,每个任务需消耗一定的cpu和内存,给出任务的开始时间和截止时间,完成任务可获得一定的金钱,同时提前完成有奖金,延后完成要扣钱。计算到某个时间所得收入。 首先按照任务的开始时间和价值进行排序,然后就是模拟题目描述的过程了。 1 #include 2 #include 3 #include 4 using namespace std; 5 #define MAXN 10000+10 6 7 struct Job 8 { 9 int a, b;10 int t, u;11 int v, w, x;12 ... 阅读全文
posted @ 2013-08-14 15:25 xiaobaibuhei 阅读(358) 评论(0) 推荐(0)
摘要:题目大意:有一颗完全二叉树,给节点一个信号会从一个表中选择一对信号分别传递给两个子节点。最后判断所有叶子节点是否满足给定的规则。题目有点长,具体可参见原题。 首先是表格中数据的存储,由于会有多个元素,用vector进行保存。其次,树是完全二叉树,可以用数组存储树。然后就是遍历二叉树了。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 struct Signal 7 { 8 int left, right; 9 };10 vector table[20][20];11 char tree[2100];1... 阅读全文
posted @ 2013-08-13 17:01 xiaobaibuhei 阅读(716) 评论(0) 推荐(0)
摘要:题目大意:给一个整数序列,他们的和为0。通过对这些数进行移动,使得他们全部为0。在相邻两个数之间移动一个单位(如2,-1变成1,0)为一个单位的工作量,求最小的工作量。 用贪心解决,首先使第一个数为0,然后在考虑第二个数,以此类推。在把第一个数移为0的过程中,先考虑最近的需求或供给,此为贪心。 1 #include 2 #define MAXN 100000+10 3 4 int a[MAXN]; 5 6 int main() 7 { 8 #ifdef LOCAL 9 freopen("in", "r", stdin);10 #endif11 int n 阅读全文
posted @ 2013-08-12 17:02 xiaobaibuhei 阅读(237) 评论(0) 推荐(0)
摘要:题目大意:给出一些数,把他们相加,计算最小代价。 很明显感觉是贪心,不过开始想错了,只是把他们排了一下序然后相加,想的太简单了。。。属于哈夫蔓树的模型吧,看别人的代码,新试了一下优先队列,还要好好看看优先队列的东西。 1 #include 2 #include 3 using namespace std; 4 5 struct Node 6 { 7 int x; 8 bool operator a.x;10 }11 };12 13 int main()14 {15 #ifdef LOCAL16 freopen("in", "r", stdin);1... 阅读全文
posted @ 2013-08-12 14:55 xiaobaibuhei 阅读(167) 评论(0) 推荐(0)