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

这篇博客主要讨论了一个火车购票的算法实现,作者首先分析了导致仅获得90分的错误,包括变量赋值错误和循环条件问题。然后,通过修复这些错误,成功将算法优化至满分。代码中涉及到了二维数组操作、遍历查找空位以及记录座位分配的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

火车购票
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

第二次(100)

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值