杀死坏人and停电
一群魔法师围城了一个圈,其中一半好魔法师一半坏魔法师,前一半为好魔法师后一半为坏魔法师,求当k为多少时可以杀死全部的坏魔法师。
【输入格式】
一个正整数M表示分别有多少个好魔法师和坏魔法师。
【输出格式】
一个正整数,即表示在杀死第一个好魔法师杀死所有坏魔法师最小的K。
【样例输入】
3
【样例输出】
5
s为下一个要杀死的报数者的序号,t为总人数,因为每一次报数都会有一个人死亡,所以t每轮都要减1,s也要随之减1,而且每一次的所报的数超过总人数,都要取余,所以可以得出s=(s~x - 1~+K)%t;
假设K=7,t=8;如表6.3所示。
| s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7 |
|---|---|---|---|---|---|---|---|
| 0 | 6 | 5 | 5 | 1 | 3 | … | … |
//杀死坏人
#include
using namespace std;int jo(int m,int k)
{int s=0,t=2*m;for(int i=1;i<=m;i++){s=(s-1+k)%t;--t;if(s<m)return 0;}return 1;
}
int main()
{ int m,i,k;cin>>m;k=m+1;while(!jo(m,k))++k;cout<<k<<endl;return 0;
}
M个城市从城市1开始轮流断电,求最小的N使最后断电的为第K号城市。
【输入格式】
两个正整数M,K,分别表示城市数和最后断电的城市序号
【输出格式】
一个正整数N,表示两次断电相隔的城市数。
【样例输入】
6 2
【样例输出】
10
#include
using namespace std;
long m,n;
int Josephus(int m,int n,int star)
{int k=star;for(int i=1;i<=m;i++)k=(k+n-1)%i+1;return k;
}
int main()
{cin>>m>>k;n=2;while(Josephus(m,n,1)!=k)n++;cout<<n<<endl;return 0;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
