程序基本算法习题解析 写作业:学生需要完成几项作业,其中的每项作业都有一个提交的截止日期和完成所需的时间。若晚于截止日期,每晚一天,总分便会被减去一分。请计算此同学能在最少减去多少分......

题目:

学生需要完成几项作业,其中的每项作业都有一个提交的截止日期和完成所需的时间。若晚于截止日期,每晚一天,总分便会被减去一分。请计算此同学能在最少减去多少分的情况下完成所有作业,给出完成作业的顺序的方案。输入第一行为一个整数T,表示数据的组数。对于每一组数据,第一行为一个整数N(1<=N<=14),表示作业的项数。接下来的N行,每行有一个字符串str(至多100个字符)和两个整数D与C,str为作业的课程名,D为作业的截止日期,C为完成作业所需的时间。所有作业根据课程名字典序由小到大给出。输出:每组数据,先输出一行,为一个整数,表示最小要减去的分数,然后输出N行,按顺序输出完成作业的顺序的方案。若有多种方案,输出字典序最小的那个。

思路:

书上说这是一道状态压缩的动态规划算法题,给出的解析挺复杂的(我没怎么看懂,o(╥﹏╥)o)。但是我有另外一种思路,很简单,而且样例输入得到的结果是正确的,但是不知道理论上是否正确,在此分享出来让各位好友检验一下,如果思路不对,希望能不吝指出。

因为这是单线程的工作,同一时间只能做一项作业,而且必须一项作业做完后才能开始第二项作业,所以我认为要想减去的分数最小,应该先做截止日期最小的,再做截止日期第二小的,最后做截止日期最大的。

因此我们可以先定义一个结构体course,包含课程名称courseName,作业的截止日期D、完成作业所需的时间C,再定义一个排序函数,按照截止日期D对结构体对象myCourse进行排序。然后定义存储当前时间的变量currenDate和存储扣除分数的变量loss,每按顺序处理一科作业,currenDate更新(加上完成该门课程所需时间),loss也更新(加上超期时间)。

代码如下:

// Chapter14_8.cpp : Defines the entry point for the application.
// 写作业
// 学生需要完成几项作业,其中的每项作业都有一个提交的截止日期和完成所需的时间。
// 若晚于截止日期,每晚一天,总分便会被减去一分。请计算此同学能在最少减去多少分
// 的情况下完成所有作业,给出完成作业的顺序的方案。
// 输入第一行为一个整数T,表示数据的组数。对于每一组数据,第一行为一个整数N(1<=N<=14),
// 表示作业的项数。接下来的N行,每行有一个字符串str(至多100个字符)和两个整数D与C,
// str为作业的课程名,D为作业的截止日期,C为完成作业所需的时间。
// 所有作业根据课程名字典序由小到大给出。
// 输出:每组数据,先输出一行,为一个整数,表示最小要减去的分数,然后输出N行,
// 按顺序输出完成作业的顺序的方案。若有多种方案,输出字典序最小的那个。

#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;

int T,D,C; //数据的组数、作业的截止日期、完成作业所需的时间
//定义一个course结构体
typedef struct
{
	string courseName;
	int D;
	int C;
}course;
//函数申明,按截止日期从小到大排序
void date_sort(course *mycourse,int n); 

int main()
{
	cout << "输入数据的组数:";
	cin >> T;
	//处理T组数据
	while(T--)
	{
		course myCourse[20];
		int N; //作业的项数
		cout << "输入作业的项数:";
		cin >> N;
		int i,j;
		//输入作业的课程名、截止日期、完成作业所需的时间
		cout << "输入各项作业的课程名、截止日期、完成作业所需的时间:" << endl;
		for(i=0;i<N;i++)
		{
			cin >> myCourse[i].courseName >> myCourse[i].D >> myCourse[i].C;
		}
		//按截止时间从小到大排名
		date_sort(myCourse,N);
		//定义一个变量存储当前时间
		int currenDate = 0;
		//扣除的分数
		int loss = 0;
		//按顺序写作业
		for(i=0;i<N;i++)
		{
			//如果超过截止日期
			if(myCourse[i].C+currenDate > myCourse[i].D)
				//累计扣分
				loss = loss + myCourse[i].C+currenDate - myCourse[i].D;
			//更新当前时间
			currenDate = currenDate + myCourse[i].C;
		}
		cout << "最少扣除的分数为:" << loss << endl;
	}
	system("pause");
	return 0;
}

void date_sort(course *mycourse,int n)
{
	for(int i=0;i<n;i++)
	{
		for(int j=i+1;j<n;j++)
		{
			if(mycourse[i].D > mycourse[j].D)
			{
				course temp = mycourse[i];
				mycourse[i] = mycourse[j];
				mycourse[j] = temp;
			}
		}
	}
}

运行结果如下:

猜你喜欢

转载自blog.csdn.net/elma_tww/article/details/86595644