![](/img/trans.png)
[英]How can I fix my source code in my C++ program called Flix for Fun Profit Report?
[英]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);
}
将逻辑封装在一个类中,你会得到类似的东西:
#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.