POJ 2886 Who Gets the Most Candies?(反素数+线段树)
题意 :n个小盆友从1到n编号按顺时针编号,然后从第k个开始出圈,他出去之后如果他手里的牌是x,如果x是正数,那下一个出圈的左手第x个,如果x是负数,那出圈的是右手第-x个,游戏中第p个离开的孩子得到的糖果是f(p)个,f(p)是p的约数的个数。
思路 : 因为f(p)是p的约数的个数,所以,要用到反素数,反素数的定义及求法。反素数s的约数个数比小于它的数的约数个数都多,最大反素数就是要找到的那个得到糖果最多的人。线段树记录的是还剩多少 人未出列。
#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std; const int maxn = ;
char ch[maxn][] ;
int data[maxn] ; struct mode
{
int l,r ;
int value,sum ;
}tree[maxn * ] ;
//反素数表
int rev[] = {,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
//反素数对应的约数个数
int revs[] = {,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,}; void build(int v,int l,int r)
{
tree[v].l = l ;
tree[v].r = r ;
tree[v].value = r-l+ ;
if(l == r) return ;
int mid = (l + r) >> ;
build(v*,l,mid) ;
build(v*+,mid+,r) ;
} int query(int v,int x)
{
tree[v].value-- ;
if(tree[v].l == tree[v].r) return tree[v].l ;
if(x <= tree[v*].value)
return query(v*,x) ;
else return query(v*+,x-tree[v << ].value) ;
}
int main()
{
int n, k;
while(scanf("%d %d",&n,&k) != EOF)
{
int i = ,maxx = ,p = ;
while(rev[i] <= n)
i++ ;
p = rev[i-] ;
maxx = revs[i-] ;
build(,,n ) ;
for(int j = ; j <= n ; j++)
scanf("%s %d",ch[j],&data[j]) ;
int yy ;
for(int i = ; i < p ; i++)
{
n -- ;
yy = query(,k) ;
if(n == ) break ;
if(data[yy] > )
k = (k-+data[yy]-) % n + ;
else k =( (k-+data[yy])%n+n) % n+ ;
}
printf("%s %d\n",ch[yy],maxx) ;
}
return ;
}
POJ 2886 Who Gets the Most Candies?(反素数+线段树)的更多相关文章
- (中等) POJ 2886 Who Gets the Most Candies? , 反素数+线段树。
		
Description N children are sitting in a circle to play a game. The children are numbered from 1 to N ...
 - 线段树(单点更新) POJ 2886 Who Gets the Most Candies?
		
题目传送门 #include <cstdio> #include <cstring> #define lson l, m, rt << 1 #define rson ...
 - poj 2886 Who Gets the Most Candies?(线段树和反素数)
		
题目:http://poj.org/problem?id=2886 题意:N个孩子顺时针坐成一个圆圈且从1到N编号,每个孩子手中有一张标有非零整数的卡片. 第K个孩子先出圈,如果他手中卡片上的数字A大 ...
 - POJ 2886 Who Gets the Most Candies?  线段树
		
题目: http://poj.org/problem?id=2886 左右转的果断晕,题目不难,关键是准确的转啊转.因为题目要求输出约数个数最多的数,所以预处理[1,500000]的约数的个数就行了. ...
 - POJ 2886.Who Gets the Most Candies? -线段树(单点更新、类约瑟夫问题)
		
线段树可真有意思呢续集2... 区间成段的替换和增减,以及区间求和等,其中夹杂着一些神奇的操作,数据离散化,简单hash,区间异或,还需要带着脑子来写题. 有的题目对数据的操作并不是直接按照题面意思进 ...
 - POJ 2886 Who Gets the Most Candies? (线段树)
		
[题目链接] http://poj.org/problem?id=2886 [题目大意] 一些人站成一个圈,每个人手上都有一个数字, 指定从一个人开始淘汰,每次一个人淘汰时,将手心里写着的数字x展示 ...
 - POJ 2886 Who Gets the Most Candies?(线段树·约瑟夫环)
		
题意 n个人顺时针围成一圈玩约瑟夫游戏 每一个人手上有一个数val[i] 開始第k个人出队 若val[k] < 0 下一个出队的为在剩余的人中向右数 -val[k]个人 val[k ...
 - POJ 2886 Who Gets the Most Candies?
		
思路: 对于 k 位置的 孩子,他的 数字是 +num 那么因为他自己本身是要被踢走的,所以相对位置 为k= k+num-1 如果数字是 -num,那么按正着数就没影响,k=k-num.线段树存储当前 ...
 - poj 2886 "Who Gets The Most Candies?"(树状数组)
		
传送门 参考资料: [1]:http://www.hankcs.com/program/algorithm/poj-2886-who-gets-the-most-candies.html 题意: 抢糖 ...
 
随机推荐
- jquery click事件的可选参数data的作用
			
$("#ID").click({x:"value"},function (e) { alert(e.data.x); });
 - 20160322 javaweb 之jdbc-- mysql 批处理
			
package com.dzq.batch; import java.sql.Connection; import java.sql.Statement; import com.itheima.uti ...
 - WildFly 9.0.2 + SQLServer + BIRT + JNDI 处理BIRT报表发布时数据源的修改
			
一.前提需求说明: 最近在做项目的时候使用jboss WildFly发布BIRT报表,在报表中我是直接添加的JDBC数据源,通过Database URL .用户名和密码连接数据库.后来在部署到正式和测 ...
 - Java中正确使用hashCode() 和equals() 、==
			
在java编程中,经常会遇到两个对象中某个属性的比较,常常会用到的方法有: == .equals().但是两者使用起来有什么区别呢? 一.== java中的==是比较两个对象在JVM中的地址.比较好理 ...
 - Runtime 在IOS中的详细使用
			
因为之前写东西的时候,都在未知笔记中,所有大家没有看到过我的文章,今天就开始使用博客园来进行和大家沟通.好了,废话不那么多了,转入正题.下面我把runtime 给大家介绍一下. ### 一.runti ...
 - JavaScript学习笔记 -- ES6学习(三) 变量的解构赋值
			
1.解构赋值的定义 在ES6中,允许按照一定模式,从数组和对象中提取值(所谓解构),然后对变量进行赋值. var a = 1; var b = 2; var c = 3; //等价于 var [a, ...
 - cyark - 数字方舟(看侣行第三季时发现的)
			
数字方舟 Ben Kacyra
 - Cogs 1844. [JSOI2008]最大数maxnumber
			
[JSOI2008]最大数maxnumber ★★ 输入文件:bzoj_1012.in 输出文件:bzoj_1012.out 简单对比 时间限制:3 s 内存限制:162 MB [题目描述] 现在请求 ...
 - bzoj1008: [HNOI2008]越狱
			
思路:首先所有情况就是m^n,然后不可能发生越狱的情况就是第一个有m种选择,第二个要与第一个不同就是m-1种选择,第三个要与第二个不同也是m-1种选择,然后不可能发生越狱的情况数就是m*(m-1)^( ...
 - 操作系统之进程篇(4)--经典进程间通信(IPC)问题
			
1. 哲学家进餐问题: 问题描述: 五个哲学家在一个圆桌上进餐,每人的面前放了一盘意大利面,两个盘子之间有一个叉子,但是由于盘子里面的面条十分光滑,需要两个叉子才能进行就餐行为.餐桌的布局如下图所示: ...