题目链接: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 解题报告的更多相关文章

  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. RabbitMQ 延迟队列,消息延迟推送

    目录 应用场景 消息延迟推送的实现 测试结果 应用场景 目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如: 淘宝七天自动确认收货.在我们签收商品后,物流系统会在七天后延时发送一个消息给 ...

  2. 转 Tesseract-OCR 字符识别---样本训练

    转自:http://blog.csdn.net/feihu521a/article/details/8433077 Tesseract是一个开源的OCR(Optical Character Recog ...

  3. SilverLight:基础控件使用(4)-日期显示和选择类控件

    ylbtech-SilverLight-Basic-Control:基础控件使用(4)-日期显示和选择类控件 Calendar,DatePicker 1.A,返回顶部 Calendar控件(日期控件) ...

  4. iOS开发 CGBitmapContextCreate

    最近项目中,需要对图片进行各种操作. 使用CGBitmapContextCreate 创建位图上下文. CG_EXTERN CGContextRefCGBitmapContextCreate(void ...

  5. 手把手教你如何利用Meterpreter渗透Windows系统

    在这篇文章中,我们将跟大家介绍如何使用Meterpreter来收集目标Windows系统中的信息,获取用户凭证,创建我们自己的账号,启用远程桌面,进行屏幕截图,以及获取用户键盘记录等等. 相关Payl ...

  6. 转: svn服务器路径名修改(不需要全部重新拉取文件)

    svn路径名修改之后, 一大波的研发代码都可能面临变更.还有有一个svn relote神器 大家可以借助各自的SVN工具中哦relote命令完成路径的切换,而不需要全部重新download所有的新路径 ...

  7. log4net报错Could not load type 'System.Security.Claims.ClaimsIdentity'

    使用log4net,在win7上可以正常使用,但是在部分xp电脑上可以生成access数据库,但是无法写数据到mdb 排除了程序原因,怀疑是xp缺少什么dll之类的 偶然查到log4net的调试方法: ...

  8. C#中异常处理和Java的区别

    捕获异常,同样是try...catch...,这个完全一样: 抛出异常,同样是throw,这个完全一样: 函数抛出怎样的异常,Java中可以用throws定义,而C#中不用定义,相当于throws E ...

  9. Codeforces Beta Round #1 A. Theatre Square

    从今天開始.就要在Codeforces里有一个新的開始了,貌似任务非常重的说~~ Codeforces专题我将会记录全部通过的题目,事实上仅仅要通过的题目都是水题啊!. 题目大意: 依照要求计算须要多 ...

  10. 微博达人硅谷之歌:Testin云測移动搜索性能測试非常是让人信服

    微博达人硅谷之歌:Testin云測移动搜索性能測试非常是让人信服 2014/10/08 · Testin · 开发人员訪谈 2013年11月1日,谷歌运行董事长施密特(Eric Emerson Sch ...