CSP思路,201609-2火车购票

思路拆解:

输入:输入按照for循环输入一个数组

解题:

1、首先考虑遍历过程中可以找到相邻座位的情况,建立bool数组,初始化为false证明100个位子还都没有人选,依次遍历顾客发布的购票指令p,当bool为false时sum++,代表这一个座位可以暂时锁住(还不能变为true呢,因为如果你要遍历这一排五个座位后发现sum的值达不到,就需要去下一排重新找相邻的空位,之前锁的座位就是空位),所以当sum==购票指令要求的张数时,再利用一个小循环锁定之前遍历过sum相加的位子。

2、当把所有售出的位子都置为true后,寻找规律根据每个位子的坐标输出真实座位数字,当座位坐标为i,j时,真实座位数为(j+1)+5*(i),每次为true的时候输出。

3、当遍历所有100个座位后仍找不到可以相邻的座位,那么再次双层循环嵌套进行遍历,当遇到空座位false时,按照第二步所述规律输出真实座位坐标,且购买票数减一,当购买票数减到0的时候表示已达到购票指标(散位子),退出循环。

4、学到了一个goto函数,可以方便跳出任何循环,弥补了我break实在搞不清楚的问题。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,arr[101],sum;
bool b[11][6];
int main(){
    cin>>n;
    memset(b,false,sizeof(b));//将b全置为false表示还未有任何人买票 
    for(int i=0;i<n;i++){
            cin>>arr[i];//购票指令p表示要买的张数
    }
    //将已售出的位子置为true 
    for(int i=0;i<n;i++){
            for(int k=0;k<10;k++){
               sum=0;
               for(int j=0;j<5;j++){
                if(b[k][j]==false){
                    sum++;
                }
                if(sum==arr[i]){
                    for(int m=j-arr[i]+1;m<=j;m++){
                            b[k][m]=true;//位子已被售出 
                            cout<<(m+1)+5*(k)<<" ";//输出座位表 
                    } 
                    cout<<endl;
                    goto out;//去往标识符 
                }
            }    
        }
        //如果找一遍了还是找不到相领的位子 
        if(sum<arr[i]){
            for(int k1=0;k1<10;k1++){
                for(int j1=0;j1<5;j1++){
                    if(b[k1][j1]==false){
                        b[k1][j1]=true;
                        cout<<(j1+1)+5*(k1)<<" ";
                        arr[i]--;
                        if(arr[i]==0){
                            goto out1;
                        }
                    }
                }
            }
            out1:;
            cout<<endl;
        }
        
        out:; 
    }
    
}

但是提交代码测评只有40分,先记录下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值