fjnu19级集训队第一次排位赛F - Petya’s Exams题解(贪心+模拟)
题目大意:xx在n天内有m场考试,每场考试有一个公布考试的时间,考试时间,复习时间,在一天内xx只能做三件事:啥都不干,复习某一次考试,进行一次考试,而且一天只能做上述活动的一种,询问xx能否应对所有考试。
输入:n(天数),m(考试的次数),然后m行输入每场考试的公布时间,考试时间和需要复习的时间
输出:
不能应对所有考试,输出-1;
能应对考试有对于根据天数输出,如果该天休息,该天输出为0,如果该天考试,该天输出m+1,如果该天复习,该天输出复习的第几次考试。
解题思路:采用贪心的策略,让先考的先复习,后考的复习时间往后面推,如果先考的都没有复习完,就GAMEOVER了,小小的证明:如果先复习先考的都复习不完,则先复习后考的一定复习不完,将它换个意思就是:如果能复习完,则先复习先考的
#include<cstdio>
#include<algorithm>
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,有错误的地方欢迎指出