zoukankan      html  css  js  c++  java
  • OpenJudge 2746(三种方法解决Joseph问题)

    #include<stdio.h>
    #include<string.h>
    int vis[310];
    void joseph(int n,int m)
    {
        int i,j,k;
        int cnt=0,count=0;
        memset(vis,0,sizeof(vis));//0表示未选中
        for(i=1;count<n-1;i=i%n+1)//循环 n-1次 
        {
            if(vis[i]==0)
            {
               // vis[i]=1;
                cnt++;            
            }
            if(m==cnt)
            {
                vis[i]=1;//出圈 
                cnt=0;
                count++;
            }
        }
        for(j=1;j<=n;j++)
        if(vis[j]==0)
        {
            printf("%d\n",j);
            break;
        }
    }   
    int main()
    /*
    [Linker error] undefined reference to `WinMain@16' ,便是把main 写成了mian 
    */ 
    {
        int m,n;
        while(scanf("%d%d",&n,&m),n||m)
            joseph(n,m);
        return 0;
    }
     
     
    /*

    下面写递推公式:令f[i]表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n] 

    递推公式  f[1]=0;  f[i]=(f[i-1]+m)%i; (i>1) 

    因为实际生活中编号总是从1开始,我们输出f[n]+1  由于是逐级递推,不需要保存每个f[i]

    */ 
    #include <stdio.h>  
    #include<stdlib.h>
    int main()  
    
    { 
        int n,m,i,s=0; 
        scanf("%d%d",&n,&m);
        for(i=2; i<=n; i++) 
            s=(s+m)%i;  
        printf("The winner is %d\n", s+1); 
        system("pause");
    
    } 
    
    
    
    
    
    //尾插法带头结点的单向链表 
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    typedef struct Node
    {
        int num;
        struct Node *next;
    }Node;
    int main()
    {
        int i,j,n,m,count;
        Node *head,*p,*q;
        head=p=(Node *)malloc(sizeof(Node));
        while(scanf("%d%d",&n,&m),n||m)
        {
            for(i=1;i<=n;i++)
            {
                q=(Node *)malloc(sizeof(Node));
                q->num=i;
                p->next=q;
                p=p->next;
            }
            p->next=head;//构成循环链表 ,此时pq是一样的 
            j=0,count=0;
            for(p=head,q=p->next;count<n-1;)
            {
                j++;
                if(j==m)//删除 q结点 
                {
                    p->next=q->next;
                    free(q);
                    q=p->next;//因为此时q已经释放,不能写成 q=q->next
                    count++;//不能写在for内 
                    j=0;   
                }
                else
                {
                    p=p->next;
                    q=p->next; 
                }
                if(q==head)//数到头结点则跳过去
                {
                    p=p->next;
                    q=q->next;
                }
                /*
                if(count==n-1) break;
                这句也可,不要for内的条件判定,但是不可放在第一个if内 ;
                因为需要经过第二个if
                */ 
            }
            printf("%d\n",q->num);//或者p->next->num,因为最后就剩两个节点,且p=head,q=head->next 
        }
        return 0;
    } 
    /*
    若是多次输入,第一次结果正确,再次输入相同内容,结果不对
    很可能是因为某些语句位置不正确,特别是带break的,(比如
    printf语句中的变量在break语句之后还会有变化) 
    */ 
                    
        
    
    
           
    
  • 相关阅读:
    HDU 3911 Black And White 分段树 题解
    Haskell 差点儿无痛苦上手指南
    CFileDialog的使用方法简单介绍
    对 dpif_class 结构体的一点认识
    三层架构之基础知识
    五类常见算法小记 (递归与分治,动态规划,贪心,回溯,分支界限法)
    AlertDialog具体解释
    delphi tcp/ip IdTCPServer1实例一
    23种设计模式(15):备忘录模式
    Android APK反编译具体解释(附图)
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2617310.html
Copyright © 2011-2022 走看看