hdu1276兵士の訓練キューの問題[簡単なSTLのリスト]

トピックスアドレス

hdu1276

カジュアルワーキング

コードと解説

タイトルは、STLのリストは二重にリンクされたリストで、STLのリストを使用しています。これは、挿入および削除の操作は、多くの場合、数回あり、連続したメモリ空間、ポインタを介したデータへのアクセスである必要はなく、効率的にどこにでも挿入取り除きます。ベクターとは、それらが異なるアプリケーションシナリオを持って、逆の利点と欠点をリスト:
ベクター(1):以下の挿入および削除操作、頻繁なランダムアクセス要素
(2)リスト:頻繁な挿入及び欠失、少ないランダムアクセス。
リンクリストのリストを使用している場合、我々は、イテレータを使用する必要があります。たとえば、この問題のコードは、int型のリストは、私たちは、イテレータの方法を定義しますlist<int>::iterator it;これは、リストに対処する私たちを助けるために、それへのポインタに相当します。例えば、リンクリストの最初の要素のために、我々は、直接[0]表現するために使用することはできませんが、それは、それは始まりはここでのポイントです*使用する必要がありますit=a.begin();
もちろん、ヘッダファイルに注意を払うようにSTLのリストを使用している場合#include<list>
、以下のことは、この問題のためのC ++コードであります

#include<iostream>
#include<list>
using namespace std;
int main()
{
    int N;
    int x;
    int i; 
    list<int> a;
    list<int>::iterator it; 
    int k;  
    scanf("%d",&N);
    while(N--){
        scanf("%d",&x);
        a.clear();
        for(i=0;i<x;i++){
            a.push_back(i+1);//存每个士兵的编号(索引加1) 
        }
        k=2;//第一次删喊“2”的 
        while(a.size()>3){
            i=0;
            for(it=a.begin();it!=a.end();){
                if((i+1)%k==0){//删除喊“k”的士兵 
                    it=a.erase(it);//it指到下一位的地址 
                }
                else{
                    it++;//it指到下一位的地址 
                }
                i++;
            }
            if(k==2) k = 3;
            else k = 2; 
        }
        for(it=a.begin();it!=a.end();){
            printf("%d",*it);
            it++;
            if(it!=a.end()) printf(" "); 
            else printf("\n");
        } 
    }
    return 0;
} 

おすすめ

転載: www.cnblogs.com/hardcoreYutian/p/11367077.html