list的使用-Hdu 1276

士兵队列训练问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 18547    Accepted Submission(s): 7903

Problem Description

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

Input

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

Output

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

Sample Input

2
20
40

Sample Output

1 7 19
1 19 37

理解题意:

假设有n个人,1.2循环报数,报2的人踢出去;然后1.3循环报数,报3的人踢出去;然后1.2和1.3循环报数,直到剩下人的人数不超过3人

解题思路:

利用list容器解题,首先创建mylist,然后把n个人都标记为各自的序号;然后当mylist的长度大于3时进入循环,每次循环时用num来对所有的人进行标记,只要是2或3的倍数,就踢出去,然后把剩下的人的原来的序号输出即可

代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int t,n;
    cin>>t;
    while(t--){
        cin>>n;
        int k = 2;
        list<int>mylist;
        list<int>::iterator it;
        for(int i = 1;i <= n; i++)
            mylist.push_back(i);
        while(mylist.size()>3){
            int num = 1;
            for(it = mylist.begin(); it != mylist.end();){
                if(num++ % k == 0)
                    it = mylist.erase(it);
                else
                    it++;
            }
            k==2?k=3:k=2;
        }
        for(it = mylist.begin();it != mylist.end();it++){
            if(it != mylist.begin())
                cout<<" ";
            cout<<*it;
        }
        cout<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/jingshixin/p/12241791.html

时间: 2024-10-26 06:31:34

list的使用-Hdu 1276的相关文章

HDU 1276 士兵队列训练问题(模拟)

原题代号:HDU 1276 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1276 题目原题: 士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8914    Accepted Submission(s): 3940 Problem Description 某部队进行新兵队

hdu 1276士兵队列问题【queue】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1276 士兵队列训练问题                                               Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)                                                           

hdu 1276 士兵队列训练问题

Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数...,以后从头开始轮流进行一至二报数.一至三报数直到剩下的人数不超过三人为止. Input 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000. Output 共有N行,分别对应输入的新兵人

hdu 1276 多重背包

735 3 4 125 6 5 3 350 //735的最大额,3种,4个125,6个5,3个350 633 4 500 30 6 100 1 5 0 1 735 0 0 3 10 100 10 50 10 10 735 630 0 0 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #inc

HDU 1276:士兵队列训练问题(纯C)

Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数...,以后从头开始轮流进行一至二报数.一至三报数直到剩下的人数不超过三人为止. Input 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000. Output 共有N行,分别对应输入的新兵人数,每行输出剩下

HDU 1276 士兵队列训练问题 解题心得

原题: Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数...,以后从头开始轮流进行一至二报数.一至三报数直到剩下的人数不超过三人为止. Input 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000. Output 共有N行,分别对应输入的新兵人数,每行

ACM学习历程—HDU 1276 士兵队列训练问题(队列)

Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠 拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数...,以后从头开始轮流进行一至二报数.一至三报 数直到剩下的人数不超过三人为止. Input 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000. Output 共有N行,分别对应输入的新兵人数,每行输出

HDU分类

模拟题, 枚举 1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 1049 1050 1057 1062 1063 1064 1070 1073 1075 1082 1083 1084 1088 1106 1107 1113 1117 1119 1128 1129 1144 1148 1157 1161 1170 1172 1177 1197 1200 1201 12

转载:hdu 题目分类 (侵删)

转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092.1093. 1094.1095.1096.1097.1098.1106.1108.1157.116