zoj 2313 Chinese Girls' Amusement 解题报告
题目链接: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操作。
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- using namespace std;
- const int maxn = + ;
- int num[maxn];
- char str[maxn];
- inline int CharToInt(char i)
- {
- return (i - '');
- }
- void Div(int num[], int len)
- {
- int i = , f = ;
- while (i < len)
- {
- if (num[i] & )
- num[i+] += ;
- num[i++] = (num[i] == && f ? : num[i]>>); // 第一位有可能是1
- f = ;
- }
- }
- void Minus(int num[], int len)
- {
- int i = len-;
- while (i >= && num[i] == ) // 防止类似100000的情况
- num[i--] = ;
- num[i] -= ; // 末尾不是0的话,直接从最后一位减1即可。
- }
- inline void Print(int num[], int len)
- {
- int i = ;
- if (num[i] == ) // 过滤前导零
- i++;
- for ( ; i < len; i++)
- printf("%d", num[i]);
- printf("\n");
- }
- int main()
- {
- int T;
- while (scanf("%d", &T) != EOF)
- {
- while (T--)
- {
- memset(num, , sizeof(num));
- scanf("%s", str); // 如果前面用getchar()再用gets(str)会OutputlimitExceeded
- int len = strlen(str);
- for (int i = ; i < len; i++)
- num[i] = CharToInt(str[i]);
- if (num[len-]&) // 奇数直接等于n/2;
- {
- Div(num, len);
- Print(num, len);
- }
- else
- {
- Div(num, len);
- Minus(num, len); // 偶数分情况讨论
- if (num[len-] & )
- Print(num, len);
- else
- {
- Minus(num, len);
- Print(num, len);
- }
- }
- if (T)
- puts("");
- }
- }
- return ;
- }
- 对于 http://blog.watashi.ws/623/andrew-stankevich-1-solutio/ 这个人的写法中
- int *Mul(int *num)
- {
- for(int i=0;i<n;i++){
- if(num[i]&1) num[i+1]+=10;
- num[i]>>=1;
- }
- num[n]=0; /* 这部分写得很妙,应该就是为了处理前导0的情况, 简洁方便 */
- while(*num==0){
- ++num;
- n--;
- }
- return num;
- }
zoj 2313 Chinese Girls' Amusement 解题报告的更多相关文章
- 数学+高精度 ZOJ 2313 Chinese Girls' Amusement
题目传送门 /* 杭电一题(ACM_steps 2.2.4)的升级版,使用到高精度: 这次不是简单的猜出来的了,求的是GCD (n, k) == 1 最大的k(1, n/2): 1. 若n是奇数,则k ...
- Acdream Chinese Girls' Amusement
A - Chinese Girls' Amusement Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Jav ...
- ACdream 1210 Chinese Girls' Amusement(高精度)
Chinese Girls' Amusement Time Limit:1000MS Memory Limit:64000KB 64bit IO Format:%lld & ...
- ACDream:1210:Chinese Girls' Amusement【水题】
Chinese Girls' Amusement Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Oth ...
- 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 ...
- 2016NEFU集训第n+5场 A - Chinese Girls' Amusement
Description You must have heard that the Chinese culture is quite different from that of Europ ...
- acdream 1210 Chinese Girls' Amusement (打表找规律)
题意:有n个女孩围成一个圈从第1号女孩开始有一个球,可以往编号大的抛去(像传绣球一样绕着环来传),每次必须抛给左边第k个人,比如1号会抛给1+k号女孩.给出女孩的人数,如果他们都每个人都想要碰到球一次 ...
- 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& ...
- ZOJ 3706 Break Standard Weight 解题报告
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5009 题目意思:给出两个mass:x 和 y,问如何将其中一个 ma ...
随机推荐
- C# 将 WebService 封装成动态库
C# 将 WebService 封装成动态库 服务与服务之间的远程调用,经常会通过Web Service来实现,Web Service是支持跨语言调用的,可以是java调用c++或c#调用java等, ...
- Java过滤HTML标签工具类
过滤HTML标签能有效的放置XSS攻击. 封装: import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springf ...
- sql server trace
http://www.cnblogs.com/zhijianliutang/p/4113911.html http://www.cnblogs.com/studyzy/archive/2009/01/ ...
- 快速比较两个uiimage是否相等防止使用原始dsdata造成界面卡顿问题
UIImage *imageLater = image1; UIImage *imagePre = image2; if (imageLater == imagePre){....}
- iOS -- SKSpriteNode类
SKSpriteNode类 继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) ...
- Android -- 开机启动无界面后台程序
简单的说,这是一个没有界面的后台运行的应用程序 而且,还有一功能:开机自启动,启动运行一个服务 程序结构非常简单,两个类,一个是service的扩展类,一个是BroadcastReceiver扩展类 ...
- 如何使用ssh远程编辑定时任务crontab?
linxu定时任务使用crontab,编辑crontab可以直接编辑:crontab -e:也可以直接读取文件 crontab file.这两种操作都不需要特殊权限sudo.区别在于,crontab ...
- SSH 原理和公匙私匙
先主要介绍了Telnet.SSH 的通信原理,分析了其通信时的工作流程. Telnet 无论Telnet协议连接的是什么类型终端,都会转换为NVT(Net Virtual Terminal)格式进行通 ...
- Flex4_Tree组件1(添加、删除、展开、关闭、右键菜单)
1.屏蔽系统菜单:工程目录“html-template”文件夹-->“index.template.html”文件中,在var params = {};语句下添加新语句: para ...
- MySQL 下优化SQL语句的一些经验
http://java-guru.iteye.com/blog/143377