思路:
由于数据范围比较小,可以暴力判断每一天优先复习哪一门功课。首先选择的这门功课的s要<=i,并且d>i,且剩余的复习天数大于0。贪心策略为优先取考试日期比较靠前的,考试日期靠后的可以向后推。如果到最后还有功课的c值大于0,那么输出-1.
代码:
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<vector> using namespace std; #define inf 0x3f3f3f3f int n,m,dis[105]; struct node { int s,d,c; }p[105]; int main() { scanf("%d%d",&n,&m); for(int i=0;i<m;i++) scanf("%d%d%d",&p[i].s,&p[i].d,&p[i].c); memset(dis,0,sizeof dis); for(int i=1;i<=n;i++) { int tmp=-1,minn=n+1; for(int j=0;j<m;j++) { if(p[j].d==i) { dis[i]=m+1; break; } if(p[j].s<=i && p[j].d>i && p[j].d<minn && p[j].c>0) { minn=p[j].d; tmp=j; } } if(dis[i]==0 && tmp!=-1) dis[i]=tmp+1,p[tmp].c--; } for(int i=0;i<m;i++) { if(p[i].c>0) { printf("-1\n"); exit(0); } } for(int i=1;i<=n;i++) { if(i>1) printf(" "); printf("%d",dis[i]); } printf("\n"); return 0; }