испытание метода моделирования

Планирование туризма 7-1

С дорожной картой для путешествий на автомобиле, вы будете знать, длина трассы между городом и дорожными сборами, которые будут взиматься. Теперь вам нужно написать программу, чтобы помочь туристам прийти к консультации, чтобы найти кратчайший путь между отправлением и назначением. Если есть несколько путей являются кратчайшими, вам нужно вывести наименее дорогостоящий путь.

Формат ввода:
вход Описание: первый входной линии 4 данные приведены положительные целые числа N, M, S, D, где N (2≤N≤500) является количество города, город предполагается образом пронумерованы от 0 до ( N-1); М представляет собой количество шоссе, 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,6,1,3,2,5,4 завода по этому приказу, работник , чтобы получить два несмешивающихся 7,6 заряженного цвета на другой в соответствии с 7, 6, чтобы в стеке на полке, может быть загружено непосредственно , чтобы получить 1; 3 времени и должно получить по предварительному номеру кода цветового поля 6; 2 может быть загружено непосредственно получает, затем удаляют с верхней полки 3 загружаются ; затем получить 5, 6 расположены над предварительной кода, наконец , взять цвет № 4 был загружен непосредственно; остатки последовательно удалены с полок 5,6,7 последовательно загружены.
Тем не менее, если фабрика отгрузки в соответствии с этим для того , 3,1,5,4,2,6,7, рабочие должны быть сердитым Жеребьевка полки, потому что цвет пакет 2 заполняется после множества коробок не съезжать на полке вы получите окно № 3, что невозможно успешно выполнить поставленную задачу. Кроме того, полки ограниченной емкости, если накопление товаров превышает мощность рабочих не существует способа , чтобы выполнить поставленную задачу успешно. Такие , как отгруженные в соответствии с 7,6,5,4,3,2,1 этого порядком, если полка достаточно высоко, коробки могут быть уложены 6, он все еще может быть успешно завершен, но только если полки коробки сложены пяти рабочих но и злиться ...... по этой теме , пожалуйста , определить , какие, поставки фабричной порядка могли позволить рабочим успешно выполнить поставленную задачу.
Пример ввода:

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

Историк династии Сун Сима Гуан, есть знаменитый «моральная теория» в «Зеркало»: «Фактическое появление у святых, чтобы сделать весь добродетельными, добродетельный и смерть, что дурак, Руби, что джентльмен, просто Shengde что злодей. люди, которые берут на себя операции, Ий не святые, и с джентльменом, был его злодеем, не как неразумные ".

Теперь дает моральную и одерживает ряд кандидатов, пожалуйста, дайте допуск ранжированы в соответствии с теорией Сима Гуан.

Формат ввода:
ввод первой линии дает три положительных целых чисел, соответственно: N (≦ 10
5.
, Т.е. общее количество кандидатов, L (≥60), самый низкий балл для кандидата, т.е. не де точек и Caifen) ниже L кандидаты имеют права быть рассмотрены для приема, H (<100), приоритет линии впуска - не Caifen де точек и ниже эта линия определяются как «всего добродетельными лучшими» кандидаты по такому по убыванию разберется нравственным, Caifen , но не де - класс отнесен к услугам кандидатов линии является «только Рубином», также сортируется по баллам, но за первыми кандидатами категории, оценки были низкими нравственными кандидаты H, но не менее Caifen де точки «мертвые и добродетельные» , но есть «Рубин только» человек, отсортированный по счету, но за второй категорией кандидатов, другая низкой линия L кандидаты также сортируются в соответствии, но за кандидатами третьей категории.

Затем N строк, каждая строка содержит информацию обследуемого, содержащую: номер билета, де точки, Caifen, в котором число билета 8-битовое целое число, целое число делится моральный интервалом [0, 100] в пределах. Между чисел, разделенных пробелом.

Выходной формат:
первая строка выводится первым заданное число кандидатов , чтобы достичь минимального балл 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 две упорядоченные последовательности

Есть два известных неравной длину последовательности по убыванию S1, S2, S1 и S2 Схема оценки функции и множество медианы. Упорядоченная последовательность А0, А1, ⋯, AN- 1 относится к среднему значению A (N-1) / 2, то есть, первый ⌊ (N + 1) / 2⌋ число (А0 является число 1).
Входные форматы:
Введите три строки. Первая строка дает последовательность общей длины 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
рекомендация