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