题目链接:https://codeforces.com/contest/978/problem/G
题目大意:n天m门考试,每门考试给定三个条件,分别为:1、可以开始复习的日期。2、考试日期。3、必须要复习的时间。根据以上条件,给出每天的安排,每天可以做三件事:1、考试。2、复习。3、休息
题解:先假设每天都在休息,然后依次填东西,策略是最先考试的最先复习
AC代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<iostream> #include<vector> #include<string> #include<cmath> #include<set> using namespace std; typedef long long ll; typedef unsigned long long ull; const int N = 100+5; struct exam{ int b; int s; int d; int c; }e[N]; bool cmp(exam& a,exam& b){ return a.d < b.d; } int ans[N]; int main(void){ int n,m; memset(ans,0,sizeof(ans)); scanf("%d%d",&n,&m); for(int i = 1;i <= m;i++){ scanf("%d%d%d",&e[i].s,&e[i].d,&e[i].c); e[i].b = i; } sort(e+1,e+m+1,cmp); int ok = 1; for(int i = 1;i<=m;i++){ if(ok){ for(int j=e[i].s;;j++){ if(j == e[i].d && e[i].c != 0){ ok = 0; printf("-1"); break; } if(e[i].c == 0){ ans[e[i].d] = m+1; break; } if(ans[j] == 0){ ans[j] = e[i].b; e[i].c--; } } } } if(ok){ for(int i = 1;i<=n;i++){ printf("%d",ans[i]); if(i != n){ printf(" "); } } } return 0; }