3 条题解
-
3
C语言双向链表写法 (虚拟头尾节点)
#include <stdlib.h> #include <stdio.h> typedef struct _List { struct _List *pr; int num; struct _List *ne; } List; //节点结构体 int n; List *head, *tail; //头节点、尾节点指针 void init() { head = (List*)malloc(sizeof(List)); tail = (List*)malloc(sizeof(List)); head -> pr = NULL; head -> ne = tail; tail -> pr = head; tail -> ne = NULL; } //链表初始化 void insert_to_tail(int x) { List *temp = (List*)malloc(sizeof(List)); temp -> pr = tail -> pr; temp -> num = x; temp -> ne = tail; tail -> pr -> ne = temp; tail -> pr = temp; } //在尾部新增节点 void earse(List *temp) { temp -> pr -> ne = temp -> ne; temp -> ne -> pr = temp -> pr; } //删除节点 int main() { scanf("%d", &n); init(); for(int i = 1; i <= n; i++) { insert_to_tail(i); } int rec = 1, flag = 1; //rec计数,flag标记方向 List *temp = head -> ne; while(n) { if(n == 2 && rec == 1) { //剩下两个人报1结束 printf("\n%d\n", temp -> num); break; } if(rec == 3) { //踢人 printf("%d ", temp -> num); earse(temp); n--; } if(flag && temp -> ne == tail) flag = 0; if(!flag && temp -> pr == head) flag = 1; //转换方向 flag ? temp = temp -> ne : temp = temp -> pr; //下一个人 rec = rec % 3 + 1; //报数 } return 0; }
-
2
#include<bits/stdc++.h> using namespace std; int main() { int a[10001]; int n,m=3,flag=0,l; cin>>n; for(int i=1;i<=n;++i)a[i]=false; int f=0,t=0,s=0; do{ ++t; if(t==n+1) { for(int i=1;i<=n-1;i++) { if(i==n-1)a[1]=a[i+1]; } t=1; } if(a[t]==false)++s; if(s==m) { s=0; cout<<t<<" "; a[t]=true; ++f; } }while(n-f!=2); for(int i=1;i<=n;i++) { if(a[i]==false&&flag!=1) { cout<<endl<<i; flag=1; } } }
这个会WA 解决一下从尾到头的问题 目前解决思路是将整个数组倒过来,但还没有实现。。。
-
0
C++ :
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { int n; scanf("%d",&n); int num[n],k=1,sum=0; for(int i=0;i<n;i++){ num[i]=i+1; } for(;;){ for(int i=0;i<n;i++){ for(;num[i]==0;){i++;} num[i]=k; k++; if(k==3){k=0;} } for(int i=0;i<n;i++){ if(num[i]!=0){sum++;} } if(sum==2){ for(int i=0;i<n;i++){ if(num[i]==1){ printf("%d",i+1); break; } } break; } sum=0; k=1; for(int i=n-1;i>=0;i--){ for(;num[i]==0;){i--;} num[i]=k; k++; if(k==3){k=0;} } for(int i=0;i<n;i++){ if(num[i]!=0){sum++;} } if(sum==2){ for(int i=0;i<n;i++){ if(num[i]==1){ printf("%d",i+1); break; } } break; } sum=0; } return 0; }
- 1
信息
- ID
- 102
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 145
- 已通过
- 36
- 上传者