繁体   English   中英

如何修复并使我的代码在 C++ 中工作?

[英]How can I fix and make my code work in c++?

创建一个程序,让您的老师有最少的课时。

我们从学校的老师那里知道他们在上什么课。 教师、科目、一周中的几天、几天内的小时数以及我们确定的序列号。

输入:标准输入第一行小时数(1=<O<1000)为教师人数(1=<N=<100),科目数(1=<M=<100)由一个空格隔开。 以下每一行包含4个整数,一个用空格隔开:教师编号(1=<TS=<N),所教科目编号(1=<TTS=<M),天(1=<Day=<5) 和小时 (0=<Hour=<8)。 例如 3 7 2 0 表示第三位老师在他在零时教的一周的第二天学习第七门课。

输出:一行标准输出应包含时钟最少的老师的序列号(孔时钟:没有时钟,但他在那天之前的某个时间和之后的某个小时有一个小时)! 更多的解决方案,必须打印最小的序列号!

我的想法: 1. 数一数一位老师有多少个课时 2. 我们选择最少的一个

我的代码现在是第一个。 我该如何解决?

Input 
8 3 4 
1 1 1 6
1 1 2 2
1 2 1 3
2 1 2 2
2 2 3 1
3 4 1 2
3 2 1 4
3 3 2 1

Output: 2


#include <iostream>
using namespace std;

int main ()
{
     int O;  // number of lessons
     int N;  //number of teachers
     int M;  // number of subjects

     cin >> O >> N >> M;

     int teachernumber [N];
     int lessonnumber [N];
     int day [N];
     int lesson [N];

     for (int i = 0; i <O; i ++)
     {
         cin >> teachernumber [i];
         cin >> lessonnumber [i];
         cin >> day [i];
         cin >> lesson [i];
     }

     set lessons [O];
     int pounchlessonDB [N];


     for (int i = 1; i <N; i ++) // Teachers
     {
           for (int j = 1; j <6; j ++) // Days (1-5)
           {
             lessons.clear ()

             for (int k = 0; k <9; k ++) // Hours (0-8)
             {
                 if ((i, j, k)! = 0)
                 {
                     orak.add (k)
                 }
             }

             if (orak.size ()> 1)
             {
                 pounchlessonDB + = lessons.end-lessons.begin-lessons.size
             }

           }
     }
     return 0;
}

我已将您的数组更改为向量(使其成为有效的 C++)并将变量重命名为描述性名称。

在这里,您似乎假设所有向量的大小都相同:

for (int i = 0; i < num_lessons; i++) {
    std::cin >> teachernumber[i];
    std::cin >> lessonnumber[i];
    std::cin >> day[i];
    std::cin >> lesson[i];
}

当您阅读第一行时,情况显然并非如此:

8 3 4 

使用

std::cin >> num_lessons >> num_teachers >> num_subjects;

因此, num_lessons显然大于向量的大小(它们都是num_teachers )。 这永远不会顺利。

修复后,我发现不存在或无法编译的代码:

if ((i, j, k) ! = 0) {

那不是……有用的代码。 这是什么意思?

orak.add(k)

什么是orak?

set lessons;

你是说 std::set 吗? 在那种情况下,元素类型是什么? 让我们假设:

std::set<int> lessons;

必须调用成员函数(好吧,通常): lessons.begin应该是lessons.begin()

当前草稿:

#include <iostream>
#include <vector>
#include <set>

int main()
{
    std::vector<int> teachernumber;
    std::vector<int> lessonnumber;
    std::vector<int> day;
    std::vector<int> lesson;

    {
        int num_lessons;  // number of lessons
        int num_teachers; // number of teachers
        int num_subjects; // number of subjects

        std::cin >> num_lessons >> num_teachers >> num_subjects;

        teachernumber.resize(num_lessons);
        lessonnumber.resize(num_lessons);
        day.resize(num_lessons);
        lesson.resize(num_lessons);
    }

    for (int i = 0; i < teachernumber.size(); i++) {
        std::cin >> teachernumber[i];
        std::cin >> lessonnumber[i];
        std::cin >> day[i];
        std::cin >> lesson[i];
    }

    std::set<int>    lessons;
    std::vector<int> pounchlessonDB(teachernumber.size());

    for (int i = 1; i < teachernumber.size(); i++) // Teachers
    {
        for (int j = 1; j < 6; j++) // Days (1-5)
        {
            lessons.clear();

            for (int k = 0; k < 9; k++) // Hours (0-8)
            {
                if ((i, j, k) ! = 0) {
                    orak.add(k)
                }
            }

            if (orak.size() > 1) {
                pounchlessonDB += lessons.end() - lessons.begin() -
                    lessons.size()
            }
        }
    }
}

定影

每当你有

    teachernumber.resize(num_lessons);
    lessonnumber.resize(num_lessons);
    day.resize(num_lessons);
    lesson.resize(num_lessons);

这显然意味着你应该使用

struct entry {
    int teacher;
    int subject;
    int day;
    int lesson;
};

int num_lessons, num_teachers, num_subjects; // number of subjects
std::cin >> num_lessons >> num_teachers >> num_subjects;

std::vector<entry> roster(num_lessons);

实际上,让我们动态读取所有条目:

std::vector<entry> roster;
while (num_lessons--) {
    auto& added = roster.emplace_back();
    std::cin >> added.teacher >> added.subject >> added.day >> added.lesson;
}

事实上,让我们使用文字代码和富有表现力的名称:

enum Day { Monday = 1, Tuesday, Wednesday, Thursday, Friday };
using TeacherId = unsigned;
using SubjectId = unsigned;
using Hour      = unsigned; // 0..8

struct Entry {
    TeacherId teacher;
    SubjectId subject;
    Day       day;
    Hour      timeslot;
};

unsigned num_lessons, num_teachers, num_subjects; // number of subjects
std::cin >> num_lessons >> num_teachers >> num_subjects;

std::vector<Entry> roster;
while (num_lessons--) {
    auto& added = roster.emplace_back();
    unsigned day;
    std::cin >> added.teacher >> added.subject >> day >> added.timeslot;
    added.day = static_cast<Day>(day);
}

输入验证留作以后的练习

现在,要计算“空洞时间”,您基本上需要按(老师,天,小时)排序的名册,但不考虑主题(因为这无关紧要)。 我将容器更改为一组并添加排序:

std::set<Entry> roster;

while (num_lessons--) {
    Entry added;
    unsigned day;
    std::cin >> added.teacher >> added.subject >> day >> added.timeslot;
    added.day = static_cast<Day>(day);

    roster.insert(added);
}

随着订购:

    bool operator<(Entry const& other) const
    {
        return std::tie(teacher, day, timeslot) <
            std::tie(other.teacher, other.day, other.timeslot);
    }

将逻辑封装在一个类中,你会得到类似的东西:

住在 Coliru

#include <iostream>
#include <set>
#include <tuple>
#include <vector>
#include <cassert>

enum Day { Monday = 1, Tuesday, Wednesday, Thursday, Friday };
using TeacherId = unsigned;
using SubjectId = unsigned;
using Hour      = unsigned; // 0..8

struct Roster {
    struct Entry {
        TeacherId teacher;
        SubjectId subject;
        Day       day;
        Hour      timeslot;

        bool operator<(Entry const& other) const
        {
            return std::tie(teacher, day, timeslot) <
                std::tie(other.teacher, other.day, other.timeslot);
        }
    };

    std::set<Entry> _entries;

    void add(Entry entry) {
        auto [it, no_conflict] = _entries.insert(std::move(entry));
        assert(no_conflict);
    }

    auto daySchedule(TeacherId t, Day d) const
    {
        return std::pair(_entries.lower_bound({t, 0, d, 0}),
                         _entries.upper_bound({t, 0, d, 8}));
    }

    auto allTeachers() const
    {
        std::set<TeacherId> result;
        for (auto& e : _entries)
            result.insert(e.teacher);
        return result;
    }
};

int main()
{
    Roster roster;

    unsigned num_scheduled_lessons, num_teachers, num_subjects; // number of subjects
    std::cin >> num_scheduled_lessons >> num_teachers >> num_subjects;

    while (num_scheduled_lessons--) {
        Roster::Entry lesson;
        unsigned      day;
        std::cin >> lesson.teacher >> lesson.subject >> day >> lesson.timeslot;
        lesson.day = static_cast<Day>(day);

        roster.add(lesson);
    }

    //for (auto& [t,s,d,h]: roster._entries) {
        //std::cout << t << " " << s << " " << d << " " << h << "\n";
    //}

    TeacherId winner = -1;
    unsigned  least_holes = 5 * 8; // start with max

    for (auto teacher : roster.allTeachers()) {
        unsigned holes = 0;
        for (int day = Monday; day <= Friday; ++day) {
            auto [begin, end] = roster.daySchedule(teacher, Day(day));

            if (begin == end) {
                // no lessons scheduled that day
            } else {
                unsigned first_hour  = begin->timeslot,
                         last_hour   = std::prev(end)->timeslot,
                         num_lessons = std::distance(begin, end);

                holes += (last_hour + 1 - first_hour) - num_lessons;
            }
        }

        if  (holes < least_holes) {
            winner = teacher;
            least_holes = holes;
        }
    }

    std::cout << winner << "\n";
}

哪个打印

2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM