シミュレーションテスト

観光計画7-1

車での旅行のためのロードマップを使用すると、都市と道路通行料間の高速道路の長さの充電が知っているだろう。今、あなたは出発と目的地間の最短経路を見つけるために、カウンセリングに来て観光客を支援するプログラムを記述する必要があります。複数のパスが最短ですがある場合は、出力に最も安価なパスを必要としています。

入力フォーマット:
入力説明:第1の入力データライン4はN(2≤N≤500)は都市の数であり、都市の方法を想定N、M、S、Dは、0から(に番号正の整数を与えられていますN-1); Mは、高速道路の数であり、市からSの数; Dは、番号、宛先都市です。その後のM行は、各列は、情報ハイウェイを与えられ、次のとおり、1都市2都市、高速道路の長さ、料金収入、中間空間によって分離、数字は500以下の整数です。入力ソリューションを確実にするために存在します。

出力フォーマット:
長さおよび総電荷出力パスは、行の数との間のスペースで区切られ、出力端には、余分なスペースを持つことができません。

サンプル入力:

4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20

出力例:
3 40

コードの実験

#include<stdio.h>
#include<queue>
#include<vector>
using namespace std;

struct Trip
{
    int next;
    int cost; 
    int dis;
};

vector<Trip> edge[501];
bool mark[501];  //标记
int dis[501];
int cost[501];

int main()
{
    int n, m, S, T;  //城市个数,高速公路条数,起点,终点
    int i, j;
    Trip temp;
    int newP;

    while (scanf("%d%d%d%d", &n, &m, &S, &T) != EOF)
    {
        if (n == 0 && m == 0)
            break;

        for (i = 0; i <= n; i++)
        {
            edge[i].clear();  //初始化邻接链表
            dis[i] = -1;
            mark[i] = false;
            cost[i] = 0;
        }

        while (m--) //高速公路条数
        {
            int city1, city2, len, money;
            scanf("%d%d%d%d", &city1, &city2, &len, &money);
            temp.cost = money;
            temp.next = city2;
            temp.dis = len;
            edge[city1].push_back(temp);
            temp.next = city1;
            edge[city2].push_back(temp);  //无向图,故每条边信息都要添加到两个顶点的单链表中
        }

        dis[S] = 0;
        mark[S] = 1;
        newP = S;  //起点为S
        for (i = 1; i < n; i++)
        {
            for (j = 0; j < edge[newP].size(); j++)
            {
                //更新一个顶点对它的边表内结点的距离
                int next = edge[newP][j].next;
                int money = edge[newP][j].cost;
                int len = edge[newP][j].dis;

                if (mark[next] == true)
                    continue;
                if (dis[next] == -1 || dis[next] > dis[newP] + len || ((dis[next] == dis[newP] + len) && (cost[next] > cost[newP] + money)))
                {
                    dis[next] = dis[newP] + len;
                    cost[next] = cost[newP] + money;
                }
            }

            int minx = 66666666;
            for (j = 0; j <= n; j++)
            {
                //寻找这个顶点出发的最小值
                if (mark[j] == true)
                    continue;
                if (dis[j] == -1)
                    continue;
                if (dis[j] < minx)
                {
                    minx = dis[j];
                    newP = j;
                }
            }
            mark[newP] = true;
        }

        printf("%d %d\n", dis[T], cost[T]);
    }
    return 0;
}

7-3虹ボトル

その後、積載サイト上に置かれたボトルの最初の大規模な数、および各色の特定の順序は、これらのボトルにボールを広める均等になり、次のとおりです。生産工程レインボー、このようなボトル(ありません)。
N色ペレット(オーダーは1からNまで番号付けされるかもしれない)順序に従うと仮定する虹ボトルパッケージ。今工場は各ボールの各色のボックスを持って、労働者の箱の箱は工場満たさ会場からボールを移動する必要があります。あなたはこの小さな箱は色、直接アンパック充填で満たされたボールを移動した場合、いない、一時的な棚の上に最初のボックスコードを置けば、箱が積み上げ積層する方法です。カラードレスは記入すると、次のボックスには、色で塗りつぶされていない棚の一番上を見て、彼らはそれがロードされている場合、それ以外の工場に移動してオーバーボックスを移動し、それを降ろしました。
工場出荷のオーダーは、より良い、労働者が正常にロード完了することができます。図7は、例えば、色の順序に従って、充填、7に従って次への2つの非混和性7.6ロードされた色を取得するために、この順序に応じて作業者が7,6,1,3,2,5,4工場出荷しました棚上のスタックのために6; 1を得るために直接ロードすることができ、3時間及びカラーボックス6の仮コード番号を取得する必要があり、図2は、取得直接ロードすることができ、続いて上部棚3から取り外さがロードされ;最後に色番号4に直接ロードした取る;次いで5、仮コードの上方に配置された6は、取得したまま、順次5,6,7が順次ロード棚から除去されます。
複数のボックスの後に記入カラーパッケージ2は、棚の上に下に移動していないので、この順番3,1,5,4,2,6,7にしたがって工場出荷場合、労働者は、怒りトスの棚でなければなりませんあなたは成功したタスクを完了することは不可能である、第3のボックスを取得します。財の蓄積は、労働者の能力を超えた場合に加えて、限られた容量の棚には、タスクを正常に完了するための方法はありません。棚が十分に高いである場合7,6,5,4,3,2,1この順序に従って工場出荷などの、ボックス6を積層することができ、それはまだ正常に完了することができる;しかし棚ボックスは5人を積層した場合にのみだけでなく、怒った......このトピックのあなたは、工場オーダーの出荷台数は、労働者が正常にタスクを完了できるようにすることができるもの、を判断してください。
サンプル入力:

7 5 3 
7 6 1 3 2 5 4
3 1 5 4 2 6 7 
7 6 5 4 3 2 1 

出力例:

YES 
NO 
NO

コードの実験

#include<iostream>
#include<stack>
using namespace std;

int main()
{
    int n, m, k;
    int num;

    scanf("%d%d%d", &n, &m, &k);

    while (k--)
    {
        stack <int> stk;  //申请一个栈
        int t = 1;  //第一个编号
        int flag = 0;  //判断是否超出栈容量
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &num);
            if (num == t)  //刚来的正好是需要的
            {
                t++;
                while (stk.size())  //如果不为空的话
                {
                    if (stk.top() == t)  //判断栈顶元素与需要的那个是否一致
                    {
                        stk.pop();  //是就出栈
                        t++;  //需要的下一个+1;
                    }
                    else
                        break;
                }
            }

            else  //不是需要的
            {
                stk.push(num);  //进栈
                if (stk.size() > m)
                    flag = 1;    ////如果栈的容量超出了给定范围,就标记一下。
                //注意不能break,不然栈里面就有上一个的残留。
            }
        }

        if (flag == 1 || t < n)
        {
            printf("NO\n");
        }
        else
            printf("YES\n");
    }

    return 0;
}

道徳的には7-4

宋王朝の歴史家司馬光は、有名な「道徳的な理論は、」「ミラー」であり、「聖人の実際の発生が馬鹿で、Rubyはちょうど、紳士のものだったこと全部、高潔高潔と死を行うにはShengde悪役のこと。手術を取る人、剛ない聖人、そして紳士で、その悪役だったが、愚か者としてありませんでした。」

今の道徳とスコアに候補者の数を与え、入場料は、司馬光の理論に基づいてランク付けしてあげてください。

入力フォーマットは:
最初の行の入力は、それぞれ、3つの正の整数を与える:N(≦10
5。
即ち、候補の総数は、L(≥60)、候補者のための最低スコアは、すなわち、デしない点とCaifen)を-ないCaifenデポイントとこの線の下には、このようなことにより、「全好最良の」候補として定義されるH(<100)、優先入場線; L入場のために考慮の対象候補以下道徳的から降順; Caifenが、ライン候補に割り当てられたデないクラスもなく、最初のカテゴリ候補の背後に、スコアによってソートされた、「ルビーだけ」であり、スコアは道徳的低かったですしかし、第2カテゴリー候補者の背後に、スコアによってソートされた候補者Hが、以下Caifen・デ・ポイントは、「死んだと高潔」ですが、「ルビーのみ」の人があるよりも、;他の低ラインLを候補者はまたに応じて取捨選択が、第三のカテゴリーの候補の背後にあります。

チケット番号は、8ビットの整数であり、整数内[100、0]道徳間隔を分割し、前記チケット番号、デポイント、Caifenし、:その後、N行、各行が含む、被検者の情報を与えます。数字の間のスペースで区切られています。

出力フォーマット:
最初のライン出力は、第1候補は、入力指示の順に列挙された規則に従って、入力フォーマット候補の出力に応じて、その後、M行、最小スコアMに到達するために各列を候補の数が与えられます。それらのデポイントに従って降順に同一のうち特定の候補以上存在する場合に、デ点は、出力チケット番号の昇順に結びついている場合。

サンプル入力:

14 60 80
10000001 64 90
10000002 90 60
10000011 85 80
10000003 85 80
10000004 80 85
10000005 82 77
10000006 83 76
10000007 90 78
10000008 75 79
10000009 59 90
10000010 88 45
10000012 80 100
10000013 90 99
10000014 66 60

出力例:

12
10000013 90 99
10000012 80 100
10000003 85 80
10000011 85 80
10000004 80 85
10000007 90 78
10000006 83 76
10000005 82 77
10000002 90 60
10000014 66 60
10000008 75 79
10000001 64 90

コードの実験

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct node
{
    int num;  //考号
    int de;   //德分
    int cai;  //才分
};

int cmp(struct node a, struct node b) 
{
    if ((a.de + a.cai) != (b.de + b.cai))
        return (a.de + a.cai) > (b.de + b.cai);  //从大到小排序

    else if (a.de != b.de)
        return a.de > b.de;  //从大到小排序

    else
        return a.num < b.num;  //从小到大排序
}


int main()
{
    int n, Low, High;
    scanf("%d%d%d", &n, &Low, &High);  //人数,最低线,最优线

    vector<node>v[4];  //定义一个容器为v,可以放node实体
    node temp;

    int total = n;  //达到最低人数
    for (int i = 0; i < n; i++)
    {
        scanf("%d %d %d", &temp.num, &temp.de, &temp.cai);
        if (temp.de < Low || temp.cai < Low)  //德分和才分都 < 最低线
        {
            total--;
        }
        else if (temp.de >= High && temp.cai >= High)  //德分才分不低于最低线,才德全尽
        {
            v[0].push_back(temp);
        }
        else if (temp.de >= High && temp.cai < High)  //德分达到最优线,才分低于最优线,德胜才
        {
            v[1].push_back(temp);
        }
        else if (temp.de < High && temp.cai < High && temp.de >= temp.cai)  //德才分均低于H,德分高于才分,才德兼亡
        {
            v[2].push_back(temp);
        }
        else  //其他达到最低线的考生
        {
            v[3].push_back(temp);
        }
    }

    printf("%d\n", total);  //达线人数

    for (int i = 0; i < 4; i++)  //四类考生
    {
        sort(v[i].begin(), v[i].end(), cmp);  //排序,首地址;尾地址;比较函数,自定义,返回值bool型,小于(降序)
        for (int j = 0; j < v[i].size(); j++)
        {
            printf("%d %d %d\n", v[i][j].num, v[i][j].de, v[i][j].cai);
        }
    }

    return 0;
}

中央7-5 2命じたシーケンス

二つの既知の非等長降順シーケンスS1、S2、S1およびS2機能評価設計とセットの中央値があります。配列A0、A1、⋯、AN-順序付け 1はA(N-1)の中央値を指す/ 2、すなわち、第一⌊(N + 1)/2⌋番号(A0は、数1です)。
入力フォーマット:
3行を入力します。最初の行は、共通の長さN(0 <N≤100000)のシーケンスを与え、N個の非整数の降順で、すなわち、行当たりの情報のシーケンスが続きます。スペースによってデジタル間隔。

出力フォーマット
出力入力シーケンスのビット、および行の配列の二組。

サンプル入力1:

5
1 3 5 7 9
2 3 4 5 6

出力サンプル1:
4
入力サンプル2:

6
-100 -10 1 1 1 1
-50 0 2 3 4 5

出力サンプル2:
1

コードの実験

#include <iostream>  //将两个合并,输出中间那个
#include<stdio.h>
#include <algorithm>
using namespace std;

int main()
{
    int N;

    scanf("%d", &N);
    int num[200002];
        
    for (int i = 0; i < N * 2; i++)
    {
        scanf("%d", &num[i]);
    }

    sort(num, num + (N * 2));

    printf("%d\n", num[N-1]);

    return 0;
}

おすすめ

転載: www.cnblogs.com/lqx0123/p/11938721.html
おすすめ