P1826 猴子选大王数据再加强版
题目描述
有 nnn 只猴子围成一圈,顺时针编号依次为 1,2,3,⋯ ,n1, 2, 3,\cdots, n1,2,3,⋯,n。从第一只猴子开始,不断进行如下操作:顺时针数恰好 mmm 只猴子,使其出列,再从下一只猴子开始重新计数,如此循环,直到最后只剩下一只猴子。最后剩下来的猴子是这局游戏的获胜者。
现在你需要对于 n=a,a+1,⋯ ,bn=a,a+1,\cdots,bn=a,a+1,⋯,b 计算出哪只猴子成为获胜者的次数最多,输出对应的编号。如果有多只猴子成为获胜者的次数均最多,将它们的编号从小到大输出。
输入格式
输入共一行三个数 a,b,ma, b, ma,b,m,如题。
输出格式
输出共两行。
第一行输出获胜次数最多的猴子获胜的次数。
第二行输出若干个数,为猴子的编号。
输入输出样例 #1
输入 #1
1 10 3
输出 #1
4
1
说明/提示
样例解释
| n=n=n= | 111 | 222 | 333 | 444 | 555 | 666 | 777 | 888 | 999 | 101010 |
|---|---|---|---|---|---|---|---|---|---|---|
| 大王编号 | 111 | 222 | 222 | 111 | 444 | 111 | 444 | 777 | 111 | 444 |
因此最多的是 111 号,共获胜了 444 回。
数据规模与约定
对于 100%100\%100% 的数据,保证 1≤a≤b≤1061 \leq a \leq b \leq 10 ^ 61≤a≤b≤106,m≤3000m \leq 3000m≤3000。
C++实现
#include <bits/stdc++.h>
using namespace std;
int f[1000010];
int vis[1000010];
int a,b,m;
int main()
{
scanf("%d%d%d",&a,&b,&m);
f[1] = 1;
int ans = 0;
for(int i = 1;i <= b;i++)
{
f[i] = (f[i-1]+m-1)%i+1;
if(i>=a)
{
vis[f[i]]++;
ans = max(ans,vis[f[i]]);
}
}
printf("%d\n",ans);
for(int i = 1;i <= b;i++)
{
if(vis[i] == ans) printf("%d ",i);
}
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
331

被折叠的 条评论
为什么被折叠?



