UVa 133:The Dole Queue 数据结构专题

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=69

题目类型: 数据结构, 链表

题意: N份申请书,排成一个圆圈, 按逆时针方向编号为1~N。 有两个公务员,公务员1站在1,往逆时针方向数到第k份,选中;公务员2站在N,往顺时针方向数到第m份,选中。 取走选中的编号的申请书,输出编号。如果编号一样,则只输出一个数。 直到所有申请书都拿光。

解体思路:  用循环链表模拟,取走的编号从链表中删除。这一题最难的地方在于两个人删除之后,他们的新位置的判断和选择,因为第一个人的新位置可能时第二个人要删除的位置,同理,第二个人的新位置也可能时第一个人要删除的位置。 最后, 循环结束的判断。 这些在代码里会有详细的注释

输入:

10 4 3
0 0 0

输出:

4 8, 9 5, 3 1, 2 6,  10, 7

where  represents a space.

#include<stdio.h>
#include<string.h>  

int prev[25];
int next[25];
int N, pos1, pos2,m,n;  

// 删除节点
void remove(int n){
    next[prev[n]] = next[n];
    prev[next[n]] = prev[n];
}  

void init(){
    memset(prev,0,sizeof(prev));
    memset(next,0,sizeof(next));
    for(int i=1; i<=N;i++){
        prev[i]=i-1;
        next[i]=i+1;
    }
    prev[1]=N;
    next[N]=1;
    pos1=1;
    pos2=N;
}  

void solve(){
    while(1){
        if(prev[pos2]==pos2 || next[pos1]==pos1 ){
            printf("%3d\n",pos1);
            break;
        }
        // 第一个人进行移动
        int stepNum=1;
        while(stepNum++<m)
            pos1 = next[pos1];
        // 第二个人进行移动
        stepNum=1;
        while(stepNum++<n)
            pos2 = prev[pos2];  

        //如果两个人移动到相同的地方
        if(pos1==pos2){
            printf("%3d,",pos1);
            // 找出两个人的新位置
		// 本文URL地址:http://www.bianceng.cn/Programming/sjjg/201410/45540.htm
            int newPos1=next[pos1],newPos2=prev[pos2];
            // 如果第一个人的新位置是第二个人要删除的位置,那么要再跳过那个位置
            if(newPos1==pos2) newPos1=next[newPos1];
            // 如果第二个人的新位置是第一个人要删除的位置,那么也要再跳过那个位置
            if(newPos2==pos1) newPos2=prev[newPos2];  

            // 把该节点删掉
            remove(pos1);  

            pos1=newPos1;
            pos2=newPos2;
        }
        else {
            int newPos1=next[pos1],newPos2=prev[pos2];  

            // 如果第一个人的新位置是第二个人要删除的位置,那么要再跳过那个位置
            if(newPos1==pos2 ) newPos1=next[newPos1];
            // 如果第二个人的新位置是第一个人要删除的位置,那么也要再跳过那个位置
            if(newPos2==pos1) newPos2=prev[newPos2];  

            // 特别情况:当最后只剩下两个结点,且两个人都选中不同的编号时,则两个都要删掉
            // 这时候,其中一个人的新位置一定还是它自己原来要删除的位置
            // 因为另一个要被另一个人删除
            if(newPos1==pos1)  { printf("%3d%3d\n",pos1,pos2);break; }
            if(newPos2==pos2) { printf("%3d%3d\n",pos1,pos2);break; }  

            printf("%3d%3d,",pos1,pos2);  

            remove(pos1);
            remove(pos2);  

            pos1=newPos1;
            pos2=newPos2;
        }
    }
}
int main()
{
    freopen("input.txt","r",stdin);
    while(scanf("%d %d %d",&N,&m,&n))
    {
        if(N==0 && m==0 && n==0) return 0;
        init();
        solve();
    }
    return 0;
}        

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据结构
, next
, 位置
, 输出
, 公务员
prev
the dole queue、数据结构 queue、queue 结构体、专题片的结构、专题片结构,以便于您获取更多的相关知识。

时间: 2024-10-31 20:06:09

UVa 133:The Dole Queue 数据结构专题的相关文章

UVa 133 The Dole Queue:模拟循环链表

133 - The Dole Queue Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=69 In a serious attempt to downsize (reduce) the dole queue, The New National Green

UVa 540:Team Queue 数据结构专题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=481 题目类型: 数据结构, 二叉树 样例输入: 2 3 101 102 103 3 201 202 203 ENQUEUE 101 ENQUEUE 201 ENQUEUE 102 ENQUEUE 202 ENQUEUE 103 ENQUEUE 2

Uva 133 The Dole Queue

题目意思:有N份申请表围城一圈,编号为逆时针编号,有两个人一个从逆时针走k步,另一个人顺时针走m,然后就有两个人所对应的申请书的编号,如果两个人走到同一个编号那么只要删除一个就好,如果不同删除两个,知道元素为空. 解题思路:我们很容易想到用循环队列来做,但是实现起来真的有点复杂,我们可以利用数组模拟,开两个数组,分别存储编号值,再开两个数组用来表示是否该位置被删除 begin1  begin2表示两个人的下一位置 注意事项:如果下一位置被删除了,那么我们要继续向下,就是要走有申请书的位置K步(或

UVa 101 The Blocks Problem 数据结构专题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=37 题目类型: 数据结构, 二叉树 题意: 有N个位置, 编号为 0-N-1, 初始下,各个位置上放置这和位置编号相同的砖块,即砖块1,砖块2--砖块N-1. 然后有四种命令操作方式: 1.move a onto b :把砖a移动到砖b上面,如果a

UVa 127:"Accordian" Patience 数据结构专题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=63 题目类型: 数据结构, 链表 题意: 发一副牌(52张,分两行), 从左往右开始, 对于当前这张牌,如果有左边第一个或左边第三个的数值(face-value)或者形状(suit)是一样的,就把该张牌移动到左边第一行或者第三行(如果左1和左3都可以移,则优先移动到左3),移动后,

UVa 10152:ShellSort 数据结构专题

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=1093 题目类型: 数据结构, 链表 样例输入: 2 3 Yertle Duke of Earl Sir Lancelot Duke of Earl Yertle Sir Lancelot 9 Yertle Duke of Earl Sir Lanc

UVA 442:Matrix Chain Multiplication 数据结构专题

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=383 题目类型: 数据结构, 链表 样例输入: 9 A 50 10 B 10 20 C 20 5 D 30 35 E 35 15 F 15 5 G 5 10 H 10 20 I 20 25 A B C (AA) (AB) (AC) (A(BC)) (

UVa 1111 Generalized Matrioshkas 数据结构专题

题目链接接: http://uva.onlinejudge.org/index.phpoption=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=2052 题目类型: 数据结构, 链表 题目大意: 这题的题意比较难懂,看了好几变才明白.  就是有一个可以嵌套娃娃的娃娃,然后嵌套在里面的娃娃又可以继续嵌套娃娃. 然后要求直接嵌套在里面(内一层)的娃娃的尺寸大小之和不能超过外面的. 例如,-3 -

UVa 784:Maze Exploration 搜索专题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105&page=show_problem&problem=725 题目类型: 搜索 样例输入: 2 XXXXXXXXX X X X X * X X X X XXXXXXXXX X X X X X X XXXXX _____ XXXXX X X X * X X X XXXXX _____ 样例输出: XXXX