书上具体所有题目:http://pan.baidu.com/s/1hssH0KO

题目:算法竞赛入门经典 3-10/UVa1587:Box

代码:

  1. //UVa1587 - Box
  2. #include<iostream>
  3. unsigned rect[6];//每个面各有一个一样的对应面,故12个边只要定义6个,其中每偶奇两个代表一个长方形的两个边长
  4. bool flag, times[3];//每个面出现的次数(出现第二次时为true)
  5. unsigned tmpx, tmpy, now;
  6. int main()
  7. {
  8. while (scanf("%u%u", &rect[0], &rect[1]) != EOF) {
  9. now = 0;
  10. flag = times[0] = times[1] = times[2] = 0;
  11. if (rect[0] < rect[1]) {
  12. auto t = rect[0];
  13. rect[0] = rect[1], rect[1] = t;
  14. }
  15. for (int i = 1;i < 6;++i) {
  16. scanf("%u%u", &tmpx, &tmpy);
  17. if (flag) continue;
  18. unsigned j;
  19. if (tmpx < tmpy) j = tmpx, tmpx = tmpy, tmpy = j;
  20. for (j = 0;j <= now;++j) {//判断新输入的数据是不是之前已经输入过的某矩形的对面
  21. if (times[j]) continue;//若当前面已经找到其对面,continue继续寻找
  22. if (rect[2 * j] == tmpx&&rect[2 * j + 1] == tmpy) {
  23. times[j] = 1;//找到对面
  24. break;
  25. }
  26. }
  27. if (j <= now) continue;//若已经找到对面
  28. if (++now > 2) { flag = 1;continue; }//若出现了第四组不同的面,则不能组成立方体
  29. rect[2 * now] = tmpx, rect[2 * now + 1] = tmpy;
  30. }
  31. if (!flag) {//下面进一步判断是否可以组成Box
  32. unsigned t;//排序,从大到小把每个矩形排序
  33. for (unsigned i = 0;i < 2;++i) {
  34. unsigned max = 2 * i;
  35. for (unsigned j = i + 1;j < 3;++j)
  36. if (rect[max] < rect[2 * j]) max = 2 * j;
  37. t = rect[max], rect[max] = rect[2 * i], rect[2 * i] = t;
  38. t = rect[max+1], rect[max+1] = rect[2 * i + 1], rect[2 * i + 1] = t;
  39. }
  40. if (rect[1] < rect[3]) t = rect[1], rect[1] = rect[3], rect[3] = t;
  41. if (rect[2] == rect[4] && rect[3] < rect[5]) t = rect[3], rect[3] = rect[5], rect[5] = t;
  42. if (rect[1] < rect[3]) t = rect[1], rect[1] = rect[3], rect[3] = t;
  43. if (rect[0] != rect[2] || rect[1] != rect[4] || rect[3] != rect[5]) flag = 1;
  44. //for (int i = 0;i < 3;++i) std::cout << rect[2 * i] << '\t' << rect[2 * i + 1] << '\n';
  45. }
  46. printf(flag ? "IMPOSSIBLE\n" : "POSSIBLE\n");
  47. }
  48. return 0;
  49. }

分析:因为每个面都有其对面,所以我只定义了3个面的边长,也就是6条边。于是在输入时就可以排除好些impossible的案例。

在代码后半段的进一步判断是否可以组成长方体时,我本来是用的比较烦的方法,比较绕,虽然答案也对而且也不是很耗时间。但是在网上看到了排序法,就是把各个矩形按长宽从大到小排列,排列后很轻松地就可以做出来。于是后来我也用了排序法。(看到了这个好方法我都不好意思把我之前写的贴出来了哈哈。唉,计算机到最后还是拼数学)

比如6个矩形分别为两个5x4的,两个4x3的,两个5x3的,经排序后即为:

5 4

5 3

4 3(对应rect[0]~rect[5])

则只需判断”if (rect[0] != rect[2] || rect[1] != rect[4] || rect[3] != rect[5]) flag = 1;”即可。

然后我又找到了一个大神的代码,其代码如下:

原文链接:http://blog.csdn.net/kun768/article/details/43701899

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct face{
  4. int x, y;
  5. }a[6];
  6. bool check()
  7. {
  8. if(memcmp(a, a+1, sizeof(face)) || memcmp(a+2, a+3, sizeof(face)) || memcmp(a+4, a+5, sizeof(face))) return false;
  9. if(a[0].x!=a[2].x || a[0].y!= a[4].x || a[2].y!=a[4].y) return false;
  10. return true;
  11. }
  12. int main()
  13. {
  14. while(cin >> a[0].x >> a[0].y >> a[1].x >> a[1].y >> a[2].x >> a[2].y >> a[3].x >> a[3].y >> a[4].x >> a[4].y >> a[5].x >> a[5].y){
  15. for(int i = 0; i < 6; ++i)
  16. if(a[i].x < a[i].y)
  17. swap(a[i].x, a[i].y);
  18. sort(a, a+6, [](const face a, const face b) {return a.x==b.x ? (a.y > b.y) : (a.x > b.x);});
  19. printf("%s\n", check() ? "POSSIBLE" : "IMPOSSIBLE");
  20. }
  21. return 0;
  22. }

只需短短23行,效率也极高。真的厉害!然后我发现其实我之前只定义3个面也是没必要的,统一判断一样简洁高效。

题目:算法竞赛入门经典 3-11/UVa1588:Kickdown

代码:

  1. //UVa1588 - Kickdown
  2. #include<iostream>
  3. #include<cstring>
  4. char a[103], b[103];
  5. int calculate(char *x, char *y) {
  6. int lenx = strlen(x), leny = strlen(y);
  7. for (int i = 0;i <= lenx;++i) {
  8. const int len = (leny < lenx - i ? leny : lenx - i);
  9. int j;
  10. for (j = 0;j != len;++j)
  11. if (x[i + j] + y[j] >= 100) break;//'2'的ASCII为50,50+50=100
  12. if (j == len)
  13. return (lenx > leny + i ? lenx : leny + i);
  14. }
  15. return 0;
  16. }
  17. int main()
  18. {
  19. while (std::cin >> a >> b) {//scanf输入字符串有bug?
  20. int re_a = calculate(a, b),
  21. re_b = calculate(b, a);
  22. printf("%d\n", re_a < re_b ? re_a : re_b);
  23. }
  24. return 0;
  25. }

分析:函数从两者的第一个字符开始比较。需要执行两遍函数,两次函数调换了a、b的位置,理解为:

第一遍:a固定不动,b的第一个字符分别指向a的第1个、第2个、第3个……数字,进行比较全数列。

第二遍:b固定不动,a的第一个字符分别指向b的第1个、第2个、第3个……数字,进行比较全数列。

两遍刚好把所有情况找全。

[刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588的更多相关文章

  1. [刷题]算法竞赛入门经典 3-12/UVa11809

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa11809:Floating-Point Numbers 代码: //UVa11 ...

  2. [刷题]算法竞赛入门经典 3-1/UVa1585 3-2/UVa1586 3-3/UVa1225

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO(我也是在网上找到的pdf,但不记得是从哪里搜刮到的了,就重新上传了一遍) PS:第一次写博客分享我的代码,不知道我对c ...

  3. [刷题]算法竞赛入门经典 3-7/UVa1368 3-8/UVa202 3-9/UVa10340

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 都是<算法竞赛入门经典(第二版)>的题目,标题上没写(第二版) 题目:算法竞赛入门经典 3-7/UVa13 ...

  4. [刷题]算法竞赛入门经典 3-4/UVa455 3-5/UVa227 3-6/UVa232

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa455:Periodic Strings 代码: //UVa455 #inclu ...

  5. [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...

  6. [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci

    题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...

  7. [刷题]算法竞赛入门经典(第2版) 6-6/UVa12166 - Equilibrium Mobile

    题意:二叉树代表使得平衡天平,修改最少值使之平衡. 代码:(Accepted,0.030s) //UVa12166 - Equilibrium Mobile //Accepted 0.030s //# ...

  8. [刷题]算法竞赛入门经典(第2版) 6-1/UVa673 6-2/UVa712 6-3/UVa536

    这三题比较简单,只放代码了. 题目:6-1 UVa673 - Parentheses Balance //UVa673 - Parentheses Balance //Accepted 0.000s ...

  9. [刷题]算法竞赛入门经典(第2版) 5-16/UVa212 - Use of Hospital Facilities

    题意:模拟患者做手术. 其条件为:医院有Nop个手术室.准备手术室要Mop分钟,另有Nre个恢复用的床.准备每张床要Mre分钟,早上Ts点整医院开张,从手术室手术完毕转移到回复床要Mtr分钟.现在医院 ...

随机推荐

  1. Mac端SVN工具CornerStone详解

    俗话说:"工欲善其事必先利其器": 对于我们程序员来说,不管你是大神,还是小鱼小虾,进入公司之后,都用过源码管理工具,不然你就不是一个合格的程序员,现在各个公司用于源码管理工具通常 ...

  2. as3中textField输入字符时,一次性过长后自动换行

    txt_show.text = showStr; var str:String = txt_show.text; var strlen:int = str.length; var len:int = ...

  3. Java基础之RTTI 运行时类型识别

    运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于R ...

  4. 性能测试分享:Jmeter的api监控工具解决方案

    性能测试分享:Jmeter的api监控工具解决方案 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询q ...

  5. 1.Java集合总结系列:Java集合概述

    一.概述 集合是 Java 中非常重要的 API,在实际应用中非常广泛,在许多面试中也是必考的知识点. Java 所有集合类都位于 java.util 包下,Java 的集合只能保存对象,而无法保存保 ...

  6. Spring基础学习(三)—详解Bean(下)

    一.Bean的生命周期 1.概述      Spring IOC容器可以管理Bean的生命周期,Spring 允许在Bean的生命周期的特定点执行定制的任务.      Spring IOC容器对Be ...

  7. 一个可能让你记忆力飙升的软件 —— 这是一道填空(keng)题

    本文题目的两个含义: 1.填上次挖的坑,将优化后的软件分享给需要的网友(下载链接附在文末): 还没有看过的网友可以先看看这篇文章: 一个可能让你记忆力飙升的软件 2.这个软件的本质其实就是生成各种填空 ...

  8. Use “error_messages” in Rails 3.2? (raises “undefined method” error)

    I am getting the following error in my Rails 3.2 functional tests: ActionView::Template::Error: unde ...

  9. CSS 预处理器中的循环

    本文由 nzbin 翻译,黄利民 校稿.未经许可,禁止转载! 英文出处:css-tricks.com 发表地址:http://web.jobbole.com/91016/ 如果你看过老的科幻电影,你一 ...

  10. C#变量、常量、枚举、预处理器指令知多少

    一.变量 C#共有其中变量类型有:静态变量.实类变量.数组元素.数值参数.引用参数.输出参数和局部变量 先定义一个简单的类来说明,如下: public class VariableDefine { p ...