http://poj.org/problem?id=2886

恩,分糖果,快乐的童年啊!

题目意思大概n个小孩围成一个圈,每个小孩手里有张卡片,记录着一个数字。开始从第k个孩子,该孩子离开圈子,然后告诉别人他手里的数字,接下来便从位于该孩子的位置加上孩子手中的数字的孩子开始,直到所有的孩子都离开了圈子,游戏便结束。每个跳出圈子的孩子都能得到一定的糖果,数目是他跳出圈子的顺序数的因子数之和。 例如第6个跳出的孩子能得到(1,2,3,6)四个糖果。

这个游戏,其实和猴子选大王是一样的!只要注意好求解相对位置即可,所谓相对位置,例如:

a,b,c,d四个人,a对应1,b对应2,c对应3,d对应4.但是当b不在以后,c便相对的为2,d也相对的为3.

然后利用线段树,轻松解决!

这里关键是学习了一下反素数表。

反素数:

对于任何正整数x,其约数的个数记做g(x)。例如g(1)=1,g(6)=4。
如果某个正整数x满足:对于任意i(0 < i < x),都有g(i) < g(x),则称x为反素数。

而反素数表就是对应上面反素数所建立的一张表,这张表好处多多,例如给你一个n,你便可以轻松的找出1~~n范围内,谁的因子数之和最多!

给出个简单的打表方法

View Code

#include<iostream>#include<string>#include<algorithm>using namespace std;

int dp[600001];

int main(){int i,j;    freopen("D:\\in.txt","w",stdout);    memset(dp,0,sizeof(dp));for(i=1;i<=500000;i++)    {for(j=1;j<=500000;j++)        {if(i*j<=600000)                dp[i*j]++;        }    }int max=0;for(i=2;i<=600000;i++)    {if(dp[i]>max)        {            max=dp[i];            cout<<i<<",";        }    }    cout<<endl<<endl;    max=0;for(i=2;i<=600000;i++)    {if(dp[i]>max)        {            max=dp[i];            cout<<dp[i]<<",";        }    }return 0;}

这是一个效率很低的程序,只是为了这道题打表而已。

接下来模拟猴子选大王就是了,当给定一个n的时候,先找出1~~n内因子数之和最大的那个数,因子数之和便是candy的答案,假设那个数是m,那么模拟到第m个人的时候,那个人便也是答案!

View Code

#include<iostream>#include<string>#include<algorithm>using namespace std;

int max_turn[40]={1,2,4,6,12,24,36,48,60,120,180,240,360,720,840,1260,1680,2520,5040,7560,10080,15120,20160,25200,27720,45360,50400,55440,83160,110880,166320,221760,277200,332640,498960,554400};int max_candy[40]={1,2,3,4,6,8,9,10,12,16,18,20,24,30,32,36,40,48,60,64,72,80,84,90,96,100,108,120,128,144,160,168,180,192,200,216};

struct child{char name[10];int pos;};

child num[500001];int n,k,pos;

struct node{int l;int r;int left;};

node tree[2500000];

void build(int i,int l,int r){    tree[i].l=l;    tree[i].r=r;    tree[i].left=r-l+1;if(l==r)return;int mid=(l+r)/2;    build(2*i,l,mid);    build(2*i+1,mid+1,r);}

void updata(int i,int w){if(tree[i].l==tree[i].r)    {        tree[i].left--;        pos=tree[i].l; //记录目前的实际位置        return;    }if(tree[2*i].left>=w)        updata(2*i,w);else if(tree[2*i+1].left>=w-tree[2*i].left)        updata(2*i+1,w-tree[2*i].left);    tree[i].left=tree[2*i].left+tree[2*i+1].left;}

int main(){int i,turn,&mod=tree[1].left,candy;    freopen("D:\\in.txt","r",stdin);while(scanf("%d%d",&n,&k)==2)    {        build(1,1,n);for(i=1;i<=n;i++)        {            scanf("%s %d",num[i].name,&num[i].pos);            }        i=0;while(max_turn[i]<=n) //寻找最大的n'            i++;        i--;        candy=max_candy[i];  //记录最多的糖果        turn=max_turn[i]; //第max_turn[i]出来的人将得到最多的糖果        pos=0;        num[0].pos=0;for(i=0;i<turn;i++)        {if(num[pos].pos>0) //求解相对剩余位置            {                k=((k+num[pos].pos-1)%mod+mod)%mod;if(k==0)                    k=mod;            }else            {                k=((k+num[pos].pos)%mod+mod)%mod;if(k==0)                    k=mod;            }            updata(1,k);        }        printf("%s %d\n",num[pos].name,candy);    }return 0;}

转载于:https://www.cnblogs.com/ka200812/archive/2011/11/14/2248914.html

线段树专辑——pku 2886 Who Gets the Most Candies?相关推荐

  1. 线段树专辑 —— pku 2482 Stars in Your Window

    http://poj.org/problem?id=2482 A了这题后,我就在想,是不是ACMER都找不到女朋友..... 这题看似很新颖,其实就是求线段树区间最值.所谓区间最值,其实就是和RMQ差 ...

  2. 线段树专辑——pku 3667 Hotel

    http://poj.org/problem?id=3667 哈哈,经典中的经典题啊.利用线段树求最大连续空闲区间,并返回空闲区间的起点坐标. View Code 1 #include<iost ...

  3. 线段树专辑—— pku 3468 A Simple Problem with Integers

    http://poj.org/problem?id=3468 典型的一道基于lazy传递的线段树题目,这题和一般题目不同的地方在于,它的每次操作不是简单的覆盖线段,而是累加.记得第一次写的时候纠结了好 ...

  4. ACM大牛总结的线段树专辑

    https://blog.csdn.net/qq_25605637/article/details/46967529 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章 ...

  5. 线段树专辑——hdu 1698 Just a Hook

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 这是一个区间染色的问题,对于区间染色问题,通常的方法是在线段树中定义一个cover域,当cover的值为- ...

  6. ACM_大牛总结的线段树专辑

    附上原出处:http://blog.csdn.net/qq_25605637/article/details/46967529 [完全版]线段树 这是从大牛那里粘过来的总结,对于刚训练线段树的我来说帮 ...

  7. 【转】线段树题目 汇总 讲解(by not only success)

    转载自:http://www.notonlysuccess.com/ 非常喜欢他的代码风格以及简洁的思路,感谢notonlysuccess! PS:他的个人网站好像是上不去了-.- 线段树 很早前写的 ...

  8. 【转载】完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ 今晚上比赛就考到了 排兵布阵啊,难受. [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时 ...

  9. 转载自杭电大牛的博客 线段树 绝对经典

    转载自:http://www.notonlysuccess.com/ 不可不看的经典 学线段树必看,大牛很多,给后人留下记录的却没有几个,谢谢这位大牛~! 因为我这最近他博客打不开了...特意从别人那 ...

最新文章

  1. META Header
  2. ACL 2022丨香港大学华为诺亚方舟新工作:生成式预训练语言模型的量化压缩
  3. Confluence 6 重构 ancestor 表
  4. json可视化编辑器_推荐一个基于 Vue 的前端界面可视化设计器项目
  5. c 语言自行实现字符串常用库函数_学习c语言的7本书——你知道吗?
  6. java Runtime
  7. 快二游戏数据分析_1.更快的数据分析
  8. 数学建模之案例学习1——企业营销额问题
  9. neo4j+python知识图谱构建(基于豆瓣TOP250电影)
  10. NLP比赛-小布助手对话短文本语义匹配
  11. Oracle数据库启动与关闭
  12. certbot泛域名证书申请
  13. 大学生亲历谷歌实习:福利丰…
  14. 支付宝电脑网页支付接口的调用
  15. C++用winhttp实现https访问服务器
  16. 我的全栈之路-C语言基础之C语言概述与开发环境搭建
  17. ftp客户端SecureFX 安装教程
  18. 常用计算机信息的交换标准编码是,信息交换用汉字编码字符集
  19. matlab地球绕太阳,matlab 怎么做地球绕太阳转 同时 月球绕地球转 动态的 可以做成圆周运动 二维的 一分钟左右...
  20. wsappx关不掉_教你wsappx进程如何关

热门文章

  1. 系统架构升级要不要上微服务?历“久”弥新微服务——你真的需要升级微服务架构吗
  2. IDEA中将代码块封装为方法,IDEA代码重构快捷键
  3. typora新增主题,typora将主题导入本地
  4. .net连接mysql数据_.net连接MYSQL数据库的方法及示例!
  5. 力所能及的做些自己喜欢和有趣的事
  6. BERT大火却不懂Transformer?读这一篇就够了 重点 命名实体识别
  7. tf.variable_scope 参数
  8. MinkowskiEngine实用函数和类
  9. 视觉导航的神经拓扑SLAM
  10. 机器人导航两篇顶级会议论文解析