Problem C 链表

Description

某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。

Input

本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。

Output

共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。

Sample Input

2 20 40

Sample Output

1 7 19 1 19 37

分析:

  用一个数组将其存下,第一次将下标为偶数的保存,下标为奇数的出列,第二次将i%3==2的数消掉,

然后又按着第一,二次这样循环往复,当数的个数小于,等于3时,输出为被消掉的数的编号。

#include <iostream>
#include <cstring>
#include <list>
const int maxn=5000+5;
using namespace std;
int main()
{
  int t;
  scanf("%d",&t);
  while (t--)
  {
    int n, a[maxn];
    memset(a, 1, sizeof(a));
    scanf("%d",&n);
    for (int i = 1; i <= n; i++)
    a[i] = i;
    int k = n;
    int loge = 2;
    while (k > 3)
    {
      int q = 0;
      if (loge == 2)
      {
        for (int i = 1; i <= n; i++)
        if (a[i] != 0 && ++q == 2)
        {
          q = 0;
          a[i] = 0;
          k--;
        }
          loge = 3;
      }
      else
      {
        for (int i = 1; i <= n; i++)
        if (a[i] != 0)
        {
          if (a[i] != 0 && ++q == 3)
          {
            q = 0;
            a[i] = 0;
            k--;
          }
        }
        loge = 2;
      }

    }
    loge = 1;
    for (int i = 1; i <= n; i++)
    if (a[i] != 0)
    if (loge)
    {
      cout << i;
      loge = 0;
    }
    else
      cout << ‘ ‘ << i;

     cout << endl;
  }

return 0;

}

时间: 2024-12-24 11:55:56

Problem C 链表的相关文章

josephus Problem 中级(使用数组模拟链表,提升效率)

问题描述: 在<josephus Problem 初级(使用数组)>中,我们提出了一种最简单直接的解决方案. 但是,仔细审视代码之后,发现此种方案的效率并不高,具体体现在,当有人出局时,遍历数组仍需要对其进行判断, 这无疑做了无用功,降低了代码效率,在人数多时尤其明显. 解决方案: 当有人出局时,考虑将当前出局的人的前一个人(未出局)的下一个人置为当前出局的下一个人(未出局).这样,便确保了每次对counter的增加都是有效的,遍历到的人都是还没有出局的.大大提升了程序的效率.这其实运用了链表

Problem E: 用链表实现约瑟夫环

Description 你听说过约瑟夫问题吗?问题大致如下:首先n个人围成一个圈,标记为1到n号.接着,从1号开始报数(从1开始),然后2号报数,然后3号...当有人报到到m时,这个人就要踢出比赛,然后从被踢出的人的下一个人开始,重新报数(从1开始).这样经过n-1次后,就只剩下了一个人,问最后剩下的那个人是几号? Input 第1行为T,表示有T组数据: 第2行到第T+1开始,每行输入n和m,n表示有几个人,m为上述的每报数m次就要踢出一个人 1=<n<=100, 1=<m<=1

链表去重

Write code to remove duplicates from an unsorted linked list FOLLOW UPHow would you solve this problem if a temporary buffer is not allowed? 题解如下: 解决此题关键是了解java reference及链表基本知识 链表类: public class LinkedListNode { LinkedListNode next=null; int data; p

【ADT】链表的基本C语言实现

什么是抽象数据类型?首先,这一概念是软件开发人员在力求编写的代码健壮.易维护且可以复用的过程中产生的.英文是AbstractData Type.有人将其比作"抽象"的墙壁,"它将接口和实现明确分开,所以用户只看到接口,因此不需要参与实现."构建者则着力实现ADT接口.ADT成为了双方的契约,这使得代码更容易维护. 接口:接口是把公共的方法和属性组合起来以封装特定功能的一个集合. 创建linked list.h头文件 1 #ifndef LIST_H_ 2 #defi

uva - Broken Keyboard (a.k.a. Beiju Text)(链表)

11988 - Broken Keyboard (a.k.a. Beiju Text) You’re typing a long text with a broken keyboard. Well it’s not so badly broken. The only problemwith the keyboard is that sometimes the “home” key or the “end” key gets automatically pressed(internally).Yo

C语言实现单链表

单链表的应用非常广,它可以实现栈,队列等: Problem 我对学习任何东西都希望能找到尽可能简单的例子,而不是看起来好高大上的: 对链表这样简答的数据结构,有些书也是写得太过“完美”啦: 初学者很难抓住重点,反正我初学的时候就是看不懂: 因此我打算从简单入手去演示: 我们需要实现下面图这样的结构,叫做链表哈: Solution 首先咱们要想到这几个ABC圆圈可以代表一个数据的节点,什么是节点呢?: 节点就好比是几个同学聚集到一个宿舍一样,他们各自有各自的身高体重: 因此,我们需要一个结构体,声

5-从尾到头打印链表

题目描述:http://ac.jobdu.com/problem.php?pid=1511 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推.当输入到-1时代表链表输入完毕.-1本身不属于链表. 输出: 对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行. 逆序打印链表,我们遍历链表只能从头到尾,现在要求我们从尾到头.后进先出,可以想到用

UVA11988 Broken Keyboard (a.k.a. Beiju Text)【数组模拟链表】

Broken Keyboard (a.k.a. Beiju Text) You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem with the keyboard is that sometimes the "home" key or the "end" key gets automatically pressed (inter

逆序建立链表

题目描述 输入整数个数N,再输入N个整数,按照这些整数输入的相反顺序建立单链表,并依次遍历输出单链表的数据. 输入 第一行输入整数N;: 第二行依次输入N个整数,逆序建立单链表. 输出 依次输出单链表所存放的数据. 示例输入 10 11 3 5 27 9 12 43 16 84 22 示例输出 22 84 16 43 12 9 27 5 3 11 #include <iostream> #include <malloc.h> using namespace std; struct