题目描述
n个人站成一圈,从某个人开始数数,每次数到m的人就被杀掉,然后下一个人重新开始数,直到最后只剩一个人。现在有一圈人,k个好人站在一起,k个坏人站在一起。从第一个好人开始数数。你要确定一个最小的m,使得在第一个好人被杀死前,k个坏人先被杀死。
感谢yh大神指出样例数据的错误。
输入输出格式
输入格式:
一个k,0<k<14
输出格式:
一个m
输入输出样例
输入样例#1:
3
输出样例#1:
5
输入样例#2:
4
输出样例#2:
30
说明
0<k<14
分析:正解就是暴力.只要稍微优美那么一点点就能过了,最最最朴素的暴力就是枚举m,然后一位一位地挪,非常慢,正确的方法是直接取模,判断是不是坏人,每一个m最多走k次就会结束游戏,每次删除一个人后把起点变一下,模数变一下就好了.需要注意的一点是每个人的下标要从0开始,不然取模的时候可能会得到0,然后就炸了.
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm>using namespace std;int k,m = 1,beginn = 1; bool flag = false,flag2 = false;bool check(int mod) {int t = (beginn + m - 1) % mod;if (t >= k){beginn = t;return true;} return false; }int main() {scanf("%d",&k);m = k;while (1){beginn = 0;flag2 = 0;for (int i = 0; i < k; i++){if (!check(2 * k - i)){flag2 = 1;break;}}if (!flag2)break;m++;}printf("%d\n",m);return 0; }