poj 2886 Who Gets the Most Candies?
2014-02-11 10:51
323 查看
http://poj.org/problem?id=2886
题意:
N个孩子顺时针坐成一个圆圈且从1到N编号,每个孩子手中有一张标有非零整数的卡片。第K个孩子先出圈,如果他手中卡片上的数字A大于零,下一个出圈的是他左手边第A个孩子。否则,下一个出圈的是他右手边第(-A)个孩子。第p个出圈的孩子会得到F(p)个糖果,F(p)为p的因子数。求得到糖果数最多的是哪个孩子及得到多少糖果。
题意:
N个孩子顺时针坐成一个圆圈且从1到N编号,每个孩子手中有一张标有非零整数的卡片。第K个孩子先出圈,如果他手中卡片上的数字A大于零,下一个出圈的是他左手边第A个孩子。否则,下一个出圈的是他右手边第(-A)个孩子。第p个出圈的孩子会得到F(p)个糖果,F(p)为p的因子数。求得到糖果数最多的是哪个孩子及得到多少糖果。
#include <cstdio> #include <cstring> #include <algorithm> #define maxn 500100 using namespace std; typedef long long ll; const int prime[16]= {1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}; int n,k; struct node { int l,r,num; } tree[maxn*3]; ll maxsum,bestnum; char name[maxn][110]; int a[maxn]; void getantiprime(ll num, ll k,ll sum,int limit) { //num:当前枚举到的数,k:枚举到的第k大的质因子;sum:该数的约数个数;limit:质因子个数上限; int i; ll temp; if(sum > maxsum) { maxsum = sum; bestnum = num; //如果约数个数更多,将最优解更新为当前数; } if(sum==maxsum && bestnum > num) bestnum = num; //如果约数个数相同,将最优解更新为较小的数; if(k > 15) return; temp = num; for(i=1; i<=limit; i++) //开始枚举每个质因子的个数; { if(temp*prime[k] > n) break; temp = temp * prime[k]; //累乘到当前数; getantiprime(temp, k+1, sum*(i+1), i); //继续下一步搜索; } } void build(int i,int l,int r)//建树 { tree[i].num=r-l+1; tree[i].l=l; tree[i].r=r; if(l<r) { int mid=(l+r)/2; build(i+i,l,mid); build(i+i+1,mid+1,r); } } int search1(int num,int i)//查找原始序号 { tree[i].num--; if(tree[i].l==tree[i].r) { return tree[i].l; } if(num<=tree[i+i].num) return search1(num,i+i); return search1(num-tree[i+i].num,i+i+1); } int main() { while(scanf("%d%d",&n,&k)!=EOF) { getantiprime(1,1,1,50);//找到n以内反素数最大的; build(1,1,n); for(int i=1; i<=n; i++) { scanf("%s %d",name[i],&a[i]); } int id; for(int i=0; i<bestnum; i++)//约瑟夫原理 { n--; id=search1(k,1); if(n==0) break; if(a[id]>0) k=(k-1+a[id]-1)%n+1; else k=((k-1+a[id])%n+n)%n+1; } printf("%s %lld\n",name[id],maxsum); } return 0; }
相关文章推荐
- poj2886 Who Gets the Most Candies?(反素数 + 线段树)
- POJ2886 Who Gets the Most Candies?(反素数+线段树模拟约瑟夫环)
- poj 2886 Who Gets the Most Candies?(线段树)
- poj 2886 Who Gets the Most Candies?
- POJ 2886 Who Gets the Most Candies?
- POJ 2886 Who Gets the Most Candies? 线段树 反素数
- poj 2886-Who Gets the Most Candies?(线段树)
- POJ-2886-Who Gets the MostCandies?-(线段树)
- POJ 2886 Who Gets the Most Candies?
- POJ 2886 Who Gets the Most Candies?(线段树 + 约瑟夫环 + 反素数)
- POJ:2886 Who Gets the Most Candies?
- poj2886 Who Gets the Most Candies?
- poj 2886 Who Gets the Most Candies?
- poj 2886 Who Gets the Most Candies?(线段树+反素数)
- poj2886 Who Gets the Most Candies? 线段树加反素数
- poj 2886 Who Gets the Most Candies?
- poj 2886 Who Gets the Most Candies?(线段树#3)
- poj 2886 Who Gets the Most Candies?(线段树和反素数)
- poj2886——Who Gets the Most Candies?
- POJ-2886-Who Gets the Most Candies?