洛谷P1145 约瑟夫
生活随笔
收集整理的這篇文章主要介紹了
洛谷P1145 约瑟夫
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目描述
n個人站成一圈,從某個人開始數(shù)數(shù),每次數(shù)到m的人就被殺掉,然后下一個人重新開始數(shù),直到最后只剩一個人。現(xiàn)在有一圈人,k個好人站在一起,k個壞人站在一起。從第一個好人開始數(shù)數(shù)。你要確定一個最小的m,使得在第一個好人被殺死前,k個壞人先被殺死。
感謝yh大神指出樣例數(shù)據(jù)的錯誤。
輸入輸出格式
輸入格式:
?
一個k,0<k<14
?
輸出格式:
?
一個m
?
輸入輸出樣例
輸入樣例#1:3 輸出樣例#1:
5 輸入樣例#2:
4 輸出樣例#2:
30
說明
0<k<14
分析:正解就是暴力.只要稍微優(yōu)美那么一點點就能過了,最最最樸素的暴力就是枚舉m,然后一位一位地挪,非常慢,正確的方法是直接取模,判斷是不是壞人,每一個m最多走k次就會結(jié)束游戲,每次刪除一個人后把起點變一下,模數(shù)變一下就好了.需要注意的一點是每個人的下標要從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; }?
轉(zhuǎn)載于:https://www.cnblogs.com/zbtrs/p/7465075.html
總結(jié)
以上是生活随笔為你收集整理的洛谷P1145 约瑟夫的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu1024Max Sum Plus
- 下一篇: 数论_1、数论概念