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

题目意思:有 N 个人(编号依次为1~N)围成一个圆圈,要求求出最大的 K (1 ≤ K ≤ N/2),表示从编号为1的人开始,将球传递给他后一个人数起的第K个人,第K个人又传递给往后数的第K个人......要求这样传递下去,且每个人都有机会接到球。也就是不存在当未使得全部人都接到一次球的情况下,某个人接收到两次以上的球。

详细的解题报告在这里:

http://blog.watashi.ws/623/andrew-stankevich-1-solutio/

而参考了这个人的写法,我也写出了属于自己的,happy ^_^~~~

http://www.xuebuyuan.com/1552889.html

比赛的时候,通过枚举小例子,只推出这个公式:

(1)  N 为奇数的时候:

  K =  N / 2

(2) N 为偶数的时候

    算出 (N-2)/2,分两种情况讨论。

(i) (N-2)/2 是奇数,K 就为  (N-2)/2

(ii) (N-2)/2 是偶数,K 就为  (N-2)/2   - 1。

例如:N = 16,K = (16-2)/2 = 7

N = 18,K = (18-2) / 2  - 1   = 7

因为 N 十分大,需要用到高精度处理。

其实我找出的规律也是正确的,只是不同表示而已~~~

对于代码中偶数需要分情况讨论,除了都需要将N/2 算完之后还需要减1操作,还要进一步讨论的原因。还是拿回16 和 18 来讲。16/2 - 1 之后是一个奇数,也就是结果啦,但是对于18,18/2 -1  = 8,正确结果应该是7,所以如果操作完第一次的除以2再减1之后发现最后那位是偶数,还需要继续执行多一步的减1操作。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. using namespace std;
  6.  
  7. const int maxn = + ;
  8. int num[maxn];
  9. char str[maxn];
  10.  
  11. inline int CharToInt(char i)
  12. {
  13. return (i - '');
  14. }
  15.  
  16. void Div(int num[], int len)
  17. {
  18. int i = , f = ;
  19. while (i < len)
  20. {
  21. if (num[i] & )
  22. num[i+] += ;
  23. num[i++] = (num[i] == && f ? : num[i]>>); // 第一位有可能是1
  24. f = ;
  25. }
  26. }
  27.  
  28. void Minus(int num[], int len)
  29. {
  30. int i = len-;
  31. while (i >= && num[i] == ) // 防止类似100000的情况
  32. num[i--] = ;
  33. num[i] -= ; // 末尾不是0的话,直接从最后一位减1即可。
  34. }
  35.  
  36. inline void Print(int num[], int len)
  37. {
  38. int i = ;
  39. if (num[i] == ) // 过滤前导零
  40. i++;
  41. for ( ; i < len; i++)
  42. printf("%d", num[i]);
  43. printf("\n");
  44. }
  45.  
  46. int main()
  47. {
  48. int T;
  49. while (scanf("%d", &T) != EOF)
  50. {
  51. while (T--)
  52. {
  53. memset(num, , sizeof(num));
  54. scanf("%s", str); // 如果前面用getchar()再用gets(str)会OutputlimitExceeded
  55. int len = strlen(str);
  56. for (int i = ; i < len; i++)
  57. num[i] = CharToInt(str[i]);
  58. if (num[len-]&) // 奇数直接等于n/2;
  59. {
  60. Div(num, len);
  61. Print(num, len);
  62. }
  63. else
  64. {
  65. Div(num, len);
  66. Minus(num, len); // 偶数分情况讨论
  67. if (num[len-] & )
  68. Print(num, len);
  69. else
  70. {
  71. Minus(num, len);
  72. Print(num, len);
  73. }
  74. }
  75. if (T)
  76. puts("");
  77. }
  78. }
  79. return ;
  80. }
  1. 对于 http://blog.watashi.ws/623/andrew-stankevich-1-solutio/ 这个人的写法中
  1. int *Mul(int *num)
  2. {
  3. for(int i=0;i<n;i++){
  4. if(num[i]&1) num[i+1]+=10;
  5. num[i]>>=1;
  6. }
  7. num[n]=0; /* 这部分写得很妙,应该就是为了处理前导0的情况, 简洁方便 */
  8. while(*num==0){
  9. ++num;
  10. n--;
  11. }
  12. return num;
  13. }
  14.  

zoj 2313 Chinese Girls' Amusement 解题报告的更多相关文章

  1. 数学+高精度 ZOJ 2313 Chinese Girls' Amusement

    题目传送门 /* 杭电一题(ACM_steps 2.2.4)的升级版,使用到高精度: 这次不是简单的猜出来的了,求的是GCD (n, k) == 1 最大的k(1, n/2): 1. 若n是奇数,则k ...

  2. Acdream Chinese Girls' Amusement

    A - Chinese Girls' Amusement Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Jav ...

  3. ACdream 1210 Chinese Girls' Amusement(高精度)

     Chinese Girls' Amusement Time Limit:1000MS     Memory Limit:64000KB     64bit IO Format:%lld & ...

  4. ACDream:1210:Chinese Girls' Amusement【水题】

    Chinese Girls' Amusement Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Oth ...

  5. A - Chinese Girls' Amusement ZOJ - 2313(大数)

    You must have heard that the Chinese culture is quite different from that of Europe or Russia. So so ...

  6. 2016NEFU集训第n+5场 A - Chinese Girls' Amusement

    Description       You must have heard that the Chinese culture is quite different from that of Europ ...

  7. acdream 1210 Chinese Girls' Amusement (打表找规律)

    题意:有n个女孩围成一个圈从第1号女孩开始有一个球,可以往编号大的抛去(像传绣球一样绕着环来传),每次必须抛给左边第k个人,比如1号会抛给1+k号女孩.给出女孩的人数,如果他们都每个人都想要碰到球一次 ...

  8. SGU 193.Chinese Girls' Amusement

    /* 实际上就是求一个k,满足k<=n/2,且gcd(n,k)=1 如果n为奇数,k为[n/2] 如果n为偶数,k=n/2-1-(n/2)%2 */ #include <iostream& ...

  9. ZOJ 3706 Break Standard Weight 解题报告

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5009 题目意思:给出两个mass:x 和 y,问如何将其中一个 ma ...

随机推荐

  1. C# 将 WebService 封装成动态库

    C# 将 WebService 封装成动态库 服务与服务之间的远程调用,经常会通过Web Service来实现,Web Service是支持跨语言调用的,可以是java调用c++或c#调用java等, ...

  2. Java过滤HTML标签工具类

    过滤HTML标签能有效的放置XSS攻击. 封装: import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springf ...

  3. sql server trace

    http://www.cnblogs.com/zhijianliutang/p/4113911.html http://www.cnblogs.com/studyzy/archive/2009/01/ ...

  4. 快速比较两个uiimage是否相等防止使用原始dsdata造成界面卡顿问题

    UIImage *imageLater = image1; UIImage *imagePre = image2; if (imageLater == imagePre){....}

  5. iOS -- SKSpriteNode类

    SKSpriteNode类 继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) ...

  6. Android -- 开机启动无界面后台程序

    简单的说,这是一个没有界面的后台运行的应用程序 而且,还有一功能:开机自启动,启动运行一个服务 程序结构非常简单,两个类,一个是service的扩展类,一个是BroadcastReceiver扩展类 ...

  7. 如何使用ssh远程编辑定时任务crontab?

    linxu定时任务使用crontab,编辑crontab可以直接编辑:crontab -e:也可以直接读取文件 crontab file.这两种操作都不需要特殊权限sudo.区别在于,crontab ...

  8. SSH 原理和公匙私匙

    先主要介绍了Telnet.SSH 的通信原理,分析了其通信时的工作流程. Telnet 无论Telnet协议连接的是什么类型终端,都会转换为NVT(Net Virtual Terminal)格式进行通 ...

  9. Flex4_Tree组件1(添加、删除、展开、关闭、右键菜单)

    1.屏蔽系统菜单:工程目录“html-template”文件夹-->“index.template.html”文件中,在var params = {};语句下添加新语句:        para ...

  10. MySQL 下优化SQL语句的一些经验

    http://java-guru.iteye.com/blog/143377