题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5009

题目意思:给出两个mass:x 和 y,问如何将其中一个 mass 一分为二(当然分完之后它们的和要等于原来的mass,或x 或 y),使得利用这三个mass 可称的数量最大。输出这个最大数量。

网上参考别人用STL中的set来写,太厉害了!!!考虑到set对于重复的元素只存储一个,那么当三个mass组合的过程中有重复的,它都会自动舍弃有重复的,不需要用if来判断!另外,也有可能其中两个mass是相等的,这时如果各放一边,就只会称到0,即不能称到任何物体!所以预先把0插入,这就是代码中为什么最后要返回  st.size()-1 的原因!!

方法一:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <set>
  6. using namespace std;
  7.  
  8. set<int> st;
  9. int cal(int a, int b, int c)
  10. {
  11. st.clear(); // 每一次都要清空集合里的元素
  12. st.insert(); // 考虑到左右两边各有一个相同mass的情况,这时称不了物体!
  13. st.insert(a); // 只选一个mass称物体
  14. st.insert(b);
  15. st.insert(c);
  16.  
  17. st.insert(a+b); // 只选两个mass称另外一边的物体
  18. st.insert(abs(a-b));
  19. st.insert(b+c);
  20. st.insert(abs(b-c));
  21. st.insert(a+c);
  22. st.insert(abs(a-c));
  23.  
  24. st.insert(abs(a+b-c)); // 两个mass在一边,另一边放第三个mass和代称物
  25. st.insert(abs(a+c-b));
  26. st.insert(abs(b+c-a));
  27.  
  28. st.insert(a+b+c); // 三个mass在一边,另一边称物体
  29. return st.size()-;
  30. }
  31.  
  32. int main()
  33. {
  34. int T, x, y, sum;
  35. while (scanf("%d", &T) != EOF)
  36. {
  37. while (T--)
  38. {
  39. sum = ;
  40. scanf("%d%d", &x, &y);
  41. for (int i = ; i <= x; i++)
  42. {
  43. int t1 = i;
  44. int t2 = x-i;
  45. int t3 = y;
  46. sum = max(sum, cal(t1, t2, t3));
  47. }
  48. for (int i = ; i <= y; i++)
  49. {
  50. int t1 = i;
  51. int t2 = y-i;
  52. int t3 = x;
  53. sum = max(sum, cal(t1, t2, t3));
  54. }
  55. printf("%d\n", sum);
  56. }
  57. }
  58. return ;
  59. }

方法二:用到dfs

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. using namespace std;
  6.  
  7. int cnt, num[];
  8. int vis[];
  9.  
  10. void dfs(int count, int now)
  11. {
  12. if (!vis[now] && now > )
  13. {
  14. vis[now] = ;
  15. cnt++;
  16. }
  17. if (count == )
  18. return;
  19. dfs(count+, now+num[count]);
  20. dfs(count+, now-num[count]);
  21. dfs(count+, now);
  22. }
  23.  
  24. int main()
  25. {
  26. int T, x, y, sum;
  27. while (scanf("%d", &T) != EOF)
  28. {
  29. while (T--)
  30. {
  31. sum = ;
  32. scanf("%d%d", &x, &y);
  33. for (int i = ; i <= x; i++)
  34. {
  35. cnt = ;
  36. memset(vis, , sizeof(vis));
  37. num[] = i;
  38. num[] = x-i;
  39. num[] = y;
  40. dfs(, );
  41. sum = max(sum, cnt);
  42. }
  43. for (int i = ; i <= y; i++)
  44. {
  45. cnt = ;
  46. memset(vis, , sizeof(vis));
  47. num[] = i;
  48. num[] = y-i;
  49. num[] = x;
  50. dfs(, );
  51. sum = max(sum, cnt);
  52. }
  53. printf("%d\n", sum);
  54. }
  55. }
  56. return ;
  57. }

ZOJ 3706 Break Standard Weight 解题报告的更多相关文章

  1. zoj 3706 Break Standard Weight(dp)

    Break Standard Weight Time Limit: 2 Seconds                                     Memory Limit: 65536 ...

  2. [ACM_水题] ZOJ 3706 [Break Standard Weight 砝码拆分,可称质量种类,暴力]

    The balance was the first mass measuring instrument invented. In its traditional form, it consists o ...

  3. zoj 3706 Break Standard Weight

    /*题意:将两个砝码中的其中一个分成两块,三块组合最多有几种情况(可以只有一块,或者两块). 组合情况 i j m 三块砝码 (i+j)-m=m-(i+j) i+j i-j=j-i  i j m (i ...

  4. [ZOJ 3076] Break Standard Weight

    题目连接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5009 题意:给你两个数字,可以把其中一个拆成两个数字,计算这三个数字 ...

  5. Break Standard Weight (ZOJ 3706)

    Problem The balance was the first mass measuring instrument invented. In its traditional form, it co ...

  6. zoj 2313 Chinese Girls' Amusement 解题报告

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1313 题目意思:有 N 个人(编号依次为1~N)围成一个圆圈,要求求 ...

  7. 【LeetCode】1046. Last Stone Weight 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 大根堆 日期 题目地址:https://leetco ...

  8. 【LeetCode】528. Random Pick with Weight 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/random-pi ...

  9. zoj 1109 Language of FatMouse 解题报告

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=109 题目意思:给出一个mouse-english词典,问对于输入的m ...

随机推荐

  1. OI 数论整理

    1.素数: 质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数. 2016 ...

  2. ftrace 提供的工具函数

    内核头文件 include/linux/kernel.h 中描述了 ftrace 提供的工具函数的原型,这些函数包括 trace_printk.tracing_on/tracing_off 等.本文通 ...

  3. mongo安装-docker

    拉取官方镜像(可以自己使用dockerFile构建): docker search mongo //查询Docker Hub 上的mongo镜像 docker pull mongo // 拉取官方镜像 ...

  4. itext A4纸张横向创建PDF

    import java.awt.Color;import java.io.FileOutputStream;import java.io.IOException; import com.lowagie ...

  5. (10) android控件-date

    1.TimePicker <TimePicker android:id="@+id/timePicker4" android:layout_width="wrap_ ...

  6. Netty构建游戏服务器(二)--Hello World

    一,准备工作 1,netty-all-4.1.5.Final.jar(官网下载) 2,eclipse 二,步骤概要 1,服务器开发 (1),创建Server类 该类是程序的主入口,有main方法,服务 ...

  7. 《从零开始搭建游戏服务器》MySQL安装配置

    一.下载资源: 到MySQL官网下载免安装版的mysql包,或者直接点击此链接下载:mysql-5.7.19-winx64.zip 二.解压配置: 将上面下载的安装包解压到一个本地目录下,在得到的my ...

  8. ETCD 单机安装

    由于测试的需要,有时需要搭建一个单机版的etcd 环境,为了方便以后搭建查看,现在对单机部署进行记录. 一.部署单机etcd 下载 指定版本的etcd下载地址 ftp://ftp.pbone.net/ ...

  9. python解析网页中js动态添加的内容

    https://www.cnblogs.com/asmblog/archive/2013/05/07/3063809.html https://www.zhihu.com/question/21471 ...

  10. OD调试器调试Delphi程序按钮事件断点方法

    这几天我调试一个Delphi程序,总是无法断点按钮事件,像我这样的菜鸟断点按钮事件真心累啊.所以我分享一下我下断点的经验!希望新手们少走弯路!!   工具/原料   OD调试器 Delphi程序 方法 ...