UVA, 305 Joseph
2017-03-23 16:59
337 查看
题目:约瑟夫环模型,环长度为n,先输出的是后n/2个数字
注意:由题目可知,可能的环长为2-30,但每个计算量大,打表,否则超时
约瑟夫环是从自己开始数n个
#include <cstdio>
#include <string.h>
#include <cstdlib>
#include <cmath>
#include <ctgmath>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void pack(vector<int> &m,int a){
for(int i=1; i <= a*2; i++){
m.push_back(i);
}
}
int main()
{
vector<int> m;
int ma[16] = {0};
int a;
for(a=1;a<=14;a++){
int t = 0,gap = 1;//gap的初始值也要注意
for(;;gap++){
pack(m,a);
int num = (gap-1)%(m.size());//关键代码
while( (m[num]>=(a+1)) && (m[num]<=(2*a)) ){
m.erase(m.begin()+num);
t++;
num = (num+gap-1)%(m.size()) ;
}//判断是不是最大的那一半数字
if(t>=a) {
m.clear();
break;
}
m.clear();
t=0;
}
ma[a]=gap;
}
int t ;
while(scanf("%d",&t),t){
cout<<ma[t]<<endl;
}
return 0;
}
形成约瑟夫环关键代码
int t = 0,gap = 1;//gap的初始值也要注意
for(;;gap++){
pack(m,a);//vector填充
int num = (gap-1)%(m.size());//关键代码//gap刚开始剪不剪1要弄清楚
while( (m[num]>=(a+1)) && (m[num]<=(2*a)) ){//没有判断条件就是一个普通的约瑟夫环
m.erase(m.begin()+num);
t++;
num = (num+gap-1)%(m.size()) ;//从刚刚单的那个下标开始,加(gao-1)M 长度,就是下一个的位置
}//判断是不是最大的那一半数字
if(t>=a) {
m.clear();
break;
}
m.clear();
t=0;
}
注意:由题目可知,可能的环长为2-30,但每个计算量大,打表,否则超时
约瑟夫环是从自己开始数n个
#include <cstdio>
#include <string.h>
#include <cstdlib>
#include <cmath>
#include <ctgmath>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void pack(vector<int> &m,int a){
for(int i=1; i <= a*2; i++){
m.push_back(i);
}
}
int main()
{
vector<int> m;
int ma[16] = {0};
int a;
for(a=1;a<=14;a++){
int t = 0,gap = 1;//gap的初始值也要注意
for(;;gap++){
pack(m,a);
int num = (gap-1)%(m.size());//关键代码
while( (m[num]>=(a+1)) && (m[num]<=(2*a)) ){
m.erase(m.begin()+num);
t++;
num = (num+gap-1)%(m.size()) ;
}//判断是不是最大的那一半数字
if(t>=a) {
m.clear();
break;
}
m.clear();
t=0;
}
ma[a]=gap;
}
int t ;
while(scanf("%d",&t),t){
cout<<ma[t]<<endl;
}
return 0;
}
形成约瑟夫环关键代码
int t = 0,gap = 1;//gap的初始值也要注意
for(;;gap++){
pack(m,a);//vector填充
int num = (gap-1)%(m.size());//关键代码//gap刚开始剪不剪1要弄清楚
while( (m[num]>=(a+1)) && (m[num]<=(2*a)) ){//没有判断条件就是一个普通的约瑟夫环
m.erase(m.begin()+num);
t++;
num = (num+gap-1)%(m.size()) ;//从刚刚单的那个下标开始,加(gao-1)M 长度,就是下一个的位置
}//判断是不是最大的那一半数字
if(t>=a) {
m.clear();
break;
}
m.clear();
t=0;
}
相关文章推荐
- UVA 305 - Joseph(模拟)
- uva 305 Joseph
- uva 305 Joseph
- UVA 305 - Joseph
- UVALive5520 UVA305 POJ1012 HDU1443 Joseph【数学计算+打表+水题】
- 约瑟夫循环问题uva305 Joseph
- UVA 305 Joseph (约瑟夫环 打表)
- UVA305 - Joseph(数论 + 打表)
- uva305 - Joseph 约瑟夫问题变形
- UVa 305 - Joseph
- UVA 305 Joseph
- uva 305 Joseph
- Uva 305 Joseph(数学+打表)
- UVa 305 / POJ 1012 Joseph (如何得到约瑟夫环的下一个位置?)
- Uva 305 - Joseph
- uva 305 - Joseph(暴力)
- Joseph - acm.uva.305(约瑟夫环)
- uva 305 Joseph(约瑟夫环解+打表)
- Uva305——Joseph
- UVA 305 Joseph (约瑟夫环 打表)