10 条题解
-
2
单向链表(循环链表,即尾节点指针指向头结点)
class Node: def __init__(self,val:int,nxt:int): self.val=val self.nxt=nxt def add (it,val): a.append(Node(val,a[it].nxt)) a[it].nxt=len(a)-1 def delete (it): a[it].nxt=a[a[it].nxt].nxt n,m=map(int,input().split()) a=[Node(i+1,i+1) for i in range(n)] a[n-1].nxt=0 it=0 f=1 while n>1: n-=1 for i in range(m-1-f): it=a[it].nxt print(a[a[it].nxt].val,end=" ") delete(it) f=0 print() it=a[it].nxt print(a[it].val)
-
2
python
N=1e5+10 a=[0]*110000 p=input().split() n=int(p[0]) m=int(p[1]) c=0 k=0 now=0 while(c!=(n-1)): now=(now+1)%n while(a[now]!=0): now=(now+1)%n k+=1; #print(k,end=" ") if(k==m): if(now==0): print(n,end=" ") else: print(now,end=" ") a[now]=1 k=0 c+=1 print() ans=-1 for i in range(n): if(a[i]==0): ans=i break if(ans==0): ans=n print(ans)
-
2
C语言单向循环链表写法
#include <stdlib.h> #include <stdio.h> typedef struct _List { int num; struct _List *ne; } List; //节点结构体 int n, m; List *head, *tail; //头指针、尾指针 void init(int x) { List *temp = (List *)malloc(sizeof(List)); temp -> num = x; temp -> ne = NULL; head = tail = temp; } //初始化链表(第一个节点) void insert_to_tail(int x) { List *temp = (List *)malloc(sizeof(List)); temp -> num = x; temp -> ne = NULL; tail -> ne = temp; tail = temp; } //将节点插入到尾部 int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) { if(i == 1) init(i); else insert_to_tail(i); } //建立链表 tail -> ne = head; //首尾相连(循环链表) int rec = 0; for(List *temp = head, *pr = NULL; temp != temp -> ne;) { //遍历循环链表 if(++rec % m == 0) { //踢人 printf("%d ", temp -> num); pr -> ne = temp -> ne; free(temp); head = temp = pr -> ne; } else { pr = temp; head = temp = temp -> ne; } } printf("\n%d\n", head -> num); return 0; }
-
2
using namespace std; int n[10000]; int main(){ int a,b; cin>>a>>b; for(int i=1;i<=a;i++){ n[i]=i; } int geshu=0; int k=0; for(int i=1;geshu!=a-1;){ if(i==a+1){ i=1; } if(n[i]!=0)k++; if(k==b){ cout<<n[i]<<" "; n[i]=0; geshu++; k=0; } i++; } cout<<endl; for(int i=1;i<=a;i++){ if(n[i]!=0){ cout<<n[i]; break; } } return 0; }
-
2
#include<bits/stdc++.h> using namespace std; int main() { int a[10001]; int n,m; cin>>n>>m; for(int i=1;i<=n;++i)a[i]=false; int f=0,t=0,s=0; do{ ++t; if(t==n+1)t=1; if(a[t]==false)++s; if(s==m) { s=0; cout<<t<<" "; a[t]=true; ++f; } }while(f!=n-1); for(int i=1;i<=n;++i) { if(a[i]==false)cout<<endl<<i; } }
-
1
我特别喜欢某人说过的一句话:所有的约瑟夫问题都可以用队列或者线段树来解决,且思路简单于一般的数组模拟
#include <bits/stdc++.h> using namespace std; queue<int> q; vector<int> ans; int main() { int n,m; cin >> n >> m; for(int i=1;i<=n;i++) q.push(i); int i=1; while(q.size()>1) { if(i == m) { int t = q.front(); q.pop(); ans.push_back(t); i = 1; } else { int t = q.front(); q.pop(); q.push(t); i++; } } for(auto x:ans) cout << x << " "; cout << endl << q.front(); return 0; }
- 1
信息
- ID
- 105
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 1460
- 已通过
- 288
- 上传者