16-09-02(火车购票90到100)

火车购票
90分的原因:没有通过最后一个测试点,即:当没有一个完整的连续座位后,开始重新从头开始寻找空座位(即:flag=false时),所有只需要检查这时的情况就好。
另:不要复制、不要复制、不要复制。不管多么类似都不要复制,手打才能减少错误。

第一次

90分
看了别的代码,惊奇的发现,大部分人的思路都出奇的一致。
先模拟一张20*5的座位图,并记录每一排座位还剩余多少空座位,初始全空所以:station[i][0]=5;
错误原因:
1、没有空排的第二次遍历时,位置记录station[i][i] =1;应该是station[i][j] =1; (这么错了都能拿90?)
2、还是没有空排的第二次遍历时,忘记m++
3.还是没有空排的第二次遍历时,一个for条件应该是j<=5,写成了j<5;
4.还是没有空排的第二次遍历时,另一个for条件应该是i<20,写成了i<n
由此可以推断:最后一个测试点是没有完整的可以连座的位置,只得90分的原因就是在此。

import java.util.*;
public class csp_16_09_02{
    
    
public static void main(String[] args){
    
    
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n];
int[][] station = new int[20][6];
int[][] result = new int[n][5];
int m =0;
int num = 0;
boolean flag = true;
//记录当前排有多少空座位 默认为五
for(int i =0;i<20;i++){
    
    
		station[i][0] = 5;
}
//输入
for(int p =0;p<n;p++) {
    
    
	int k = in.nextInt();
	//result[p] = paizuowei(station ,a[p]);
	
	
	 //第一次有空排的遍历
	 for(int i =0;i<20;i++) {
    
    
		 if(station[i][0] >= k) {
    
    //该排有位置
			 flag = true;
			 int t =0;
			 int j =1;
			 while(j<=5 && station[i][j] == 1) {
    
    //找到该排的第一个空座位
				 j++;
			 }
			 for(int q = j;q<=5;q++) {
    
    
				 if(q-j+1 > k) break;
				  if(station[i][q] == 0) {
    
    //该位置为空
					 station[i][q] = 1;//设置为被安排
					 result[m][t++] = i*5+q;//记录座位号
					 num++;//累计总票数
				 }		
			 }	 
			 station[i][0] = station[i][0] - k;//剩余空位置
			 m++;
			 break;
		 }else {
    
    
			 flag = false;//没有空排了
		 }
	
	 }//for
 //没有空排的第二次遍历
	 if(!flag) {
    
    
		 int temp_num = 0;
		 int t =0;
		 for(int i =0;i<n;i++) {
    
    
			 for(int j =1;j<5;j++){
    
    
				 if(station[i][j] == 0) {
    
    //空位置
					 station[i][i] =1;
					 result[m][t++] = i*5+j;
					 temp_num++;
					 num++;//累计总票数
					 if(temp_num>k) break;
					 if(num>100) break;
				 }			 
			 }		 
		 }//for
	 }//if
}
in.close();
//输出
for(int i =0;i<n;i++) {
    
    
	for(int j = 0;j<5;j++)
	{
    
    
		if(result[i][j]!=0)
		System.out.print(result[i][j]+" ");
	}
	System.out.println();
}

}//main
}//Main

第二次

仅仅改掉上面的小错(大错特错)之后,就会正确

import java.util.*;
public class Main{
    
    
public static void main(String[] args){
    
    
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n];
int[][] station = new int[20][6];
int[][] result = new int[n][5];
int m =0;
int num = 0;
boolean flag = true;//是否有满足条件的空排
//记录当前排有多少空座位 默认为5
for(int i =0;i<20;i++){
    
    
		station[i][0] = 5;
}
//输入
for(int p =0;p<n;p++) {
    
    
	int k = in.nextInt();
	 //第一次有空排的遍历
	 for(int i =0;i<20;i++) {
    
    
		 if(station[i][0] >= k) {
    
    //该排有位置
			 flag = true;
			 int t =0;
			 int j =1;
			 while(j<=5 && station[i][j] == 1) {
    
    //找到该排的第一个空座位
				 j++;
			 }
			 for(int q = j;q<=5;q++) {
    
    
				 if(q-j+1 > k) break;
				  if(station[i][q] == 0) {
    
    //该位置为空
					 station[i][q] = 1;//设置为被安排
					 result[m][t++] = i*5+q;//记录座位号
					 num++;//累计总票数
				 }		
			 }	 
			 station[i][0] = station[i][0] - k;//剩余空位置
			 m++;
			 break;
		 }else {
    
    
			 flag = false;//没有空排了
		 }
	
	 }//for
 //没有空排的第二次遍历
	 if(!flag) {
    
    
		 int t =0;
		 for(int i =0;i<20;i++) {
    
    
			 for(int j =1;j<=5;j++){
    
    
				 if(station[i][j] == 0) {
    
    //空位置
					 station[i][j] =1;
					 result[m][t++] = i*5+j;//转化为座位号	
					 num++;//累计总票数
					 if(t>k) break;
					 if(num>100) break;
				 }
				 
			 }
			 
		 }//for
		 m++;
	 }//if
}
in.close();
//输出
for(int i =0;i<n;i++) {
    
    
	for(int j = 0;j<5;j++)
	{
    
    
		if(result[i][j]!=0)
		System.out.print(result[i][j]+" ");
	}
	System.out.println();
}
}//main
}//Main

Guess you like

Origin blog.csdn.net/qq_51985653/article/details/121501828