栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

CCF-CSP 201609-2火车购票 详细思路及解题过程 满分题解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CCF-CSP 201609-2火车购票 详细思路及解题过程 满分题解

CCF-CSP 201609-2火车购票 详细思路及解题过程 满分题解

题目链接:CCF-CSP201609-2火车购票


90分思路(结尾附满分思路,该思路只用于记录):

设置一个数组a[N]用于记录第i排坐了多少个人,设置一个数组b[N][6]标记第i排是否被坐,坐了标记为1(用于输出)设置一个find函数,用于找到最小的排数在主函数中,遍历找到的那一排,判断是否被坐,如果没有被坐则可以坐,直接输出对应的座位号此思路只有90分是因为忽略了条件安排在编号最小的几个空座位中(不考虑是否相邻)和所有购票数量之和不超过100

具体代码如下:

#include 
#include 
using namespace std;
const int N = 1e4+10;
int n;
int a[N];//存储第i排坐了多少个
int b[N][6];//标记第i排是否被坐,坐了标记为1(用于输出)
//找到最小的排数
int find(int x)
{
    int flag = 1;
    for(int i=1;i<=N;i++)
    {
        if(x<=5-a[i])//判断第i排是否可以坐下
        {
            flag = i;
            break;
        }
    }
    return flag;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x;cin>>x;
        int t = find(x);
        a[t]+=x;//第t排被坐的数量+x
        for(int j=1,k=1;j<=5&&k<=x;j++)
        {
            if(b[t][j]==1)//如果第j个位置被坐
            {
                continue;
            }
            else
            {
                b[t][j]=1;//第j个位置被坐
                k++;//k用来记录是否坐满了x个
                cout<<5*(t-1)+j<<" ";//简单的计算输出
            }
        }
        cout< 

100分修改思路:

在90分代码的基础上,需要判断当前的排数是否超过了20对于超过20排的数据需要进行特殊处理,即应该安排在编号最小的几个空座位中(不考虑是否相邻)在进行特殊处理时,只需要双重循环遍历找到编号最小的位置就可以了

具体代码如下:

#include 
#include 
using namespace std;
const int N = 1e2+10;
int n;
int a[N];//存储第i排坐了多少个
int b[N][6];//标记第i排是否被坐,坐了标记为1(用于输出)
//找到最小的排数
int find(int x)
{
    int flag = 1;
    for(int i=1;i<=N;i++)
    {
        if(x<=5-a[i])//判断第i排是否可以坐下
        {
            flag = i;
            break;
        }
    }
    if(flag>20)return N;//最多为20排
    return flag;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x;cin>>x;
        int t = find(x);
        if(t==N)//当超过20排时就选择编号最小的位置
        {
            int k =1;//k用来记录是否坐满了x个
            //两重循环中的k<=x都不能少
            for(int i=1;i<=N&&k<=x;i++)
            {
                for(int j=1;j<=5&&k<=x;j++)
                {
                    if(b[i][j]==0)
                    {
                        k++;
                        b[i][j]=1;//标记
                        a[i]++;//人数加一
                        cout<<5*(i-1)+j<<" ";
                    }
                }
            }
            cout<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/738317.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号