问题描述
那么问题来了: 考虑一个名为 Job 的类,它具有作为数据成员的截止日期和相关的 getter/setter 方法)。假设您必须根据截止日期安排两个最早的作业。那是, 如果系统中有三个有截止日期的作业(分别是deadline1、deadline2和deadline3) 然后系统应该报告前两个最早的作业(具有最小的截止日期值)。你可能需要 找到具有最小和第二小的值的截止日期。
这是我的代码:
#include<iostream>
using namespace std;
class job
{
private:
int Deadline;
public:
static int i;
void setDeadline(int a);
int getDeadline();
};
void job::setDeadline(int a)
{
Deadline = a;
cout << "Job " << i << " Has Deadline " << Deadline << endl;
}
int job::getDeadline()
{
return Deadline;
}
int job::i = 1;
int main()
{
job job1,job2,job3,job4,job5,job6,job7,job8,job9,job10,count;
job1.setDeadline(5);
count.i++;
job2.setDeadline(3);
count.i++;
job3.setDeadline(6);
count.i++;
job4.setDeadline(12);
count.i++;
job5.setDeadline(31);
count.i++;
job6.setDeadline(20);
count.i++;
job7.setDeadline(19);
count.i++;
job8.setDeadline(2);
count.i++;
job9.setDeadline(8);
count.i++;
job10.setDeadline(7);
int array[10] = { job1.getDeadline(),job2.getDeadline(),job3.getDeadline(),job4.getDeadline(),job5.getDeadline(),job6.getDeadline(),job7.getDeadline(),job8.getDeadline(),job9.getDeadline(),job10.getDeadline() };
int temp = array[0],store = 0,first = 0,second = 0;
for (int i = 0; i <= 9; i++)
{
if (temp > array[i])
{
temp = array[i];
}
}
for (int i = 0; i <= 9; i++)
{
if (temp == array[i])
{
first = i + 1;
break;
}
}
temp = array[0];
for (int i = 0; i <= 9; i++)
{
if (temp > array[i])
{
temp = array[i];
}
}
for (int i = 0; i <= 9; i++)
{
if (temp == array[i])
{
second = i + 1;
}
}
cout << "\nJob " << first << " and Job " << second << " are earliest";
return 0;
}
我面临的问题是两次都打印第一个最小值。我想打印前 2 个最小值。我该怎么做?
解决方法
当您查找第一个值时,您会遍历数组并找到截止日期最短的工作,并用工作 ID 填充“第一个”(顺便说一句,如果您想将“工作 ID”与索引,我个人会让变量从零开始,所以 job0、job1 等等直到 job9)
当您查找第二个值时,您会执行完全相同的操作,因此您找到的工作又是截止日期最短的工作,并使用该信息填写“第二个”。
因此,当您两次执行完全相同的操作时,您将获得完全相同的值。当您搜索第二个值时,您应该考虑“first”,这样您就可以忽略已经用于“first”的作业,并且在这种情况下不更新“temp”(如果您将其命名为作业从零开始,因为您不必不断向索引添加 1)。
,我面临的问题是两次都打印第一个最小值。我想打印前 2 个最小值。我该怎么做?
使用您的解决方案:通过创建另一个临时数组,删除您已经发现的第一个元素。
我将您写为一个使用对向量的最小可执行示例,因为您没有提到限制或任何内容 - 这是我能想到的最优雅的解决方案:
#include <iostream>
#include <vector>
#include <string>
bool sortVecBySec(const std::pair<std::string,int> &a,const std::pair<std::string,int> &b)
{
return (a.second < b.second);
}
int main()
{
//Driver function to sort the vector elements by
//the second element of pairs
std::vector<std::pair <std::string,int>> v;
std::string job[10];
int deadline[10] = {5,3,6,12,31,20,19,2,8,7};
int n = sizeof(job)/sizeof(job[0]);
//Propagate string array
for(int i{}; i < 10;++i){
job[i] = "Job " + (std::to_string(i+1));
}
//Enter values in vector of pairs
for(int i{}; i<n; ++i){
v.push_back(make_pair(job[i],deadline[i]));
}
//Printing the vector of pairs
std::cout << "Vector of pairs as it is before\n";
for(int i{}; i< n; i++){
std::cout << v[i].first << " = " <<v[i].second << '\n';
}
//Using sort() function to sort by 2nd element of pairs
sort(v.begin(),v.end(),sortVecBySec);
//Printing the vector of pairs
std::cout << "\nVector of pairs from shortest to longest\n";
for(int i{}; i< 2; i++){
std::cout << v[i].first << " = " <<v[i].second << '\n';
}
std::cin.get();
return 0;
}
如果您想打印所有作业,只需在最后一个打印部分使用 n
变量而不是 2
。
我认为这应该对您有所帮助,并且在课堂上解析它应该不会太难。
,首先,当您找到最早的截止日期时,您可以通过将索引保存在那里来节省额外的一轮
first
在搜索下一个更高的截止日期值时,您必须考虑 temp = first > 1 ? array[0] : array[1];
for (int i = 0; i <= 9; i++)
{
if (temp > array[i] && array[i] > array[first])
{
temp = array[i];
second = i + 1;
}
}
。既为起始值,后来与其他值比较时
if (temp > array[i] && i != first)
{
temp = array[i];
second = i + 1;
}
请注意,当您有多个相等的值时,这将无法正常工作。 对于这种情况,请比较索引值,例如
Dim oExcel,oWB
Set oExcel = CreateObject("excel.application")
Set oWB = oExcel.Workbooks.Add()