CodeForces - 978G Java贪心

附上题目地址: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]);
			}
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值