博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva 305 Joseph
阅读量:4467 次
发布时间:2019-06-08

本文共 1099 字,大约阅读时间需要 3 分钟。

思路: 数学+打表

分析:
1 传统的约瑟夫问题是给定n个人和m,每次数m次把当前这个人踢出局,问最后留下的一个人的编号
2 这一题是前k个人是好人,后面k个是坏人。现在要求最小的m使得没有一个好人被踢出去的情况下k个坏人都被踢出
3 按照传统的方法来分析的话,n个人的编号从0~n-1
   第一次  a[1] = (m-1)%n; // 这里由于人的编号是0~n-1
   第二次  a[2] = (a[1]+m-1)%(n-1);
   第i次     a[i] = (a[i-1]+m-1)%(n-i+1);
   那么我们可以知道每次的删除的人的编号,由于k最大14所以我们可以先打表找到1~14的解,然后输出即可。
代码:

#include
#include
#include
#include
using namespace std;int solve(int k){ int pre; int tmp = k+1; int n = 2*k; while(tmp){ if((tmp-1)%n >= k && (tmp-1)%n < 2*k){ pre = (tmp-1)%n; int i; for(i = 2 ; i <= k ; i++){ int x = (pre+tmp-1)%(n-i+1); if(x < k || x >= 2*k) break; else pre = x; } if(i == k+1) return tmp; } tmp++; }}int main(){ int k , ans[20]; for(int i = 1 ; i < 15 ; i++) ans[i] = solve(i); while(scanf("%d" , &k) && k) printf("%d\n" , ans[k]); return 0;}

转载于:https://www.cnblogs.com/jiangu66/p/3228697.html

你可能感兴趣的文章
Subsequence(暴力+二分)
查看>>
Team Queue(多队列技巧处理)
查看>>
根据经纬度坐标获取位置信息(基于百度地图)
查看>>
make install fping
查看>>
排序算法总结
查看>>
easyui datagrid 三层嵌套
查看>>
MAC 下查看usb设备的命名
查看>>
as3.0 作库
查看>>
DATASNAP 自增长字段问题
查看>>
Mysql主要索引方式:FULLTEXT,HASH,BTREE,RTREE。
查看>>
POJ 1942
查看>>
android:ToolBar详解(手把手教程)
查看>>
代码保存好
查看>>
操作系统原理
查看>>
初拾Java(问题二:缺类异常,无法编译)
查看>>
C# 流总结(Stream)
查看>>
【综述】植物防御假说——Out of the quagmire of plant defense hypotheses
查看>>
C++——动态分配内存问题
查看>>
CSS3属性之圆角效果——border-radius属性
查看>>
API 数据缓存(本地缓存)
查看>>