3 条题解

  • 3
    @ 2022-11-6 15:46:12

    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
      @ 2022-7-13 8:05:38
      #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 解决一下从尾到头的问题 目前解决思路是将整个数组倒过来,但还没有实现。。。

      • @ 2022-12-7 11:07:23

        你知道一个东西叫做循环队列的吗

    • 0
      @ 2021-5-24 13:43:01

      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
      上传者