附上题目地址:http://codeforces.com/problemset/problem/978/G
也是郁闷,又是没有注意整体条件,A了两天,才出来,特此发一篇庆祝一波!
刚开始上手时候没有注意Si的作用,只是一味的以为直接暴力,把复习天数直接安排,休息时间可有可无,WA在了text3上,昨晚仔细审了一波题,终于找出自己bug所在,就是忽略了Si的作用,他限制了从Si这一天开始复习。
下面给出代码:
1.mysort()函数用来排序,按照di从小到大排序,先安排最先考试的科目。
2.S,d,C和题目给的意思相同,order那个数组我用来存Di对应的考试次数,(即这门课是第几次安排的考试)
3.被注释的地方去掉注释以后,可以在控制台看到排序的结果。以及result这个数组用来表示最终结果,初值为0,然后将m+1赋入数组,表示这一天是考试天。
import java.util.Scanner;
public class Main24 {
public static Scanner sc=new Scanner(System.in);
public static void mySort(int s[],int d[],int c[],int order[]) {
for(int i=0;i<s.length;i++)
for(int j=i;j<s.length;j++)
if(d[j]<d[i]) {
int t=0;
t=s[i];
s[i]=s[j];
s[j]=t;
t=d[i];
d[i]=d[j];
d[j]=t;
t=c[i];
c[i]=c[j];
c[j]=t;
t=order[i];
order[i]=order[j];
order[j]=t;
}
}
public static void main(String[] args) {
while(sc.hasNext()) {
int n=sc.nextInt();
int m=sc.nextInt();
int s[]=new int[m];
int d[]=new int[m];
int c[]=new int[m];
int order[]=new int[m];
for(int i=0;i<m;i++) {
s[i]=sc.nextInt();
d[i]=sc.nextInt();
c[i]=sc.nextInt();
order[i]=i+1;
}
mySort(s,d,c,order);
/*for(int k:s)
System.out.print(k+" ");
System.out.println();
for(int k:d)
System.out.print(k+" ");
System.out.println();
for(int k:c)
System.out.print(k+" ");
System.out.println();
for(int k:order)
System.out.print(k+" ");
System.out.println();*/
int result[]=new int[n];
for(int i=0;i<result.length;i++)
for(int j=0;j<s.length;j++)
if(d[j]-1==i) {
result[i]=m+1;
break;
}
/*for(int k:result)
System.out.print(k+" ");
System.out.println();*/
int j=0;int y=0;
//由于有m堂考试,所以while(m--);请忽略x=m这个。。。。
int x=m;
while(x-->0) {
if(d[j]-s[j]>=c[j]) {
//h用来判断应该循环的正确次数,day用来判断是否有c[j]的复习天数,这里我表达的有点不清楚,请多看代码。
int day=d[j]-s[j];
int h=c[j];
for(int i=s[j]-1;i<d[j]-1&&h>0;i++) {
if(result[i]!=0) {
day--;
continue;
}
else {
result[i]=order[j];
h--;
}
}
if(day<c[j]) {
y=-1;
break;
}
j++;
}
else {
y=-1;
break;
}
}
if(y==-1)
System.out.println(y);
else {
int l=0;
for(;l<result.length-1;l++)
System.out.print(result[l]+" ");
System.out.println(result[result.length-1]);
}
}
}
}