fjnu19级集训队第一次排位赛F - Petya's Exams题解(贪心+模拟)

fjnu19级集训队第一次排位赛F - Petya’s Exams题解(贪心+模拟)
fjnu19级集训队第一次排位赛F - Petya's Exams题解(贪心+模拟)_第1张图片
fjnu19级集训队第一次排位赛F - Petya's Exams题解(贪心+模拟)_第2张图片fjnu19级集训队第一次排位赛F - Petya's Exams题解(贪心+模拟)_第3张图片fjnu19级集训队第一次排位赛F - Petya's Exams题解(贪心+模拟)_第4张图片
题目大意:xx在n天内有m场考试,每场考试有一个公布考试的时间,考试时间,复习时间,在一天内xx只能做三件事:啥都不干,复习某一次考试,进行一次考试,而且一天只能做上述活动的一种,询问xx能否应对所有考试。
输入:n(天数),m(考试的次数),然后m行输入每场考试的公布时间,考试时间和需要复习的时间
输出:
不能应对所有考试,输出-1;
能应对考试有对于根据天数输出,如果该天休息,该天输出为0,如果该天考试,该天输出m+1,如果该天复习,该天输出复习的第几次考试。

解题思路:采用贪心的策略,让先考的先复习,后考的复习时间往后面推,如果先考的都没有复习完,就GAMEOVER了,小小的证明:如果先复习先考的都复习不完,则先复习后考的一定复习不完,将它换个意思就是:如果能复习完,则先复习先考的

#include
#include

using std::sort;

const int MAX_SIZE = 210;//习惯开大一点,开110就够了的,就是这么的稳健
int vis[MAX_SIZE];//记录每天干啥

struct node {
	int s, d, c,id;
}date[MAX_SIZE];

bool cmp(node a, node b) {
	return a.d < b.d;//每天只有一场考试,不怕撞车
}

int main() {
	int n, m;
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= m; i++) {
		scanf("%d %d %d",&date[i].s,&date[i].d,&date[i].c);//和蔼可亲的输入输出
		date[i].id = i;//因为要排序,把第几次考试给记上
		vis[date[i].d] = m + 1;//先将考试那天给标记
	}
	sort(date + 1, date + 1 + m, cmp);//排序,越早考的排在越前面
	for (int i = 1; i <= m; i++) {
		for (int j = date[i].s; j < date[i].d; j++) {
			if (!vis[j]) {
				date[i].c--;
				vis[j] = date[i].id;//记录这天复习哪次考试
				if (date[i].c == 0) break;//复习的能够应付了就好了,跑跑跑,少复习就可以多休息,傻笑.jpg
			}
		}
	}
	for (int i = 1; i <= m; i++) {//循环检查是否有没复习完的
		if (date[i].c > 0) {
			printf("%d", -1);
			return 0;
		}
	}
	for (int i = 1; i <= n; i++) {
		if (i > 1) printf(" ");
		printf("%d", vis[i]);
	}
	return 0;
}//可喜可贺结束啦

第一次写题解,紧张.jpg,有错误的地方欢迎指出

你可能感兴趣的:(fjnu19级集训队第一次排位赛F - Petya's Exams题解(贪心+模拟))