2018年搜狐8月28日技术类笔试题目代码分享

第一题:kolakoski序列

源码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    vector<int> a(m,0);
    cin >> n >> m;
    for(int i=0;i<m;i++)
        cin >> a[i];
    vector<int> kolakoski;
    int cou=-1;
    for(int i=0;i<a[0];i++)
    {
        kolakoski.push_back(a[0]);
    }
//每一个小数组的长度组成的数组与原数组相同
    for(int i=1;cou<n;i++)
    {
        int len=kolakoski[i];
        int num=i%m;
        int ele=a[num];
        for(int j=0;j<len;j++)
            kolakoski.push_back(ele);
        int si=kolakoski.size();
        if(si>=n)
            break;
    }
    for(int i=0;i<n;i++)
        cout << kolakoski[i] << endl;
}

第二题:装包裹问题

源码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int num[6];
    int res;
    while(1)
    {
        res=0;
        bool isbreak=1;
        for(int i=0;i<6;i++)
        {
            cin >> num[i];
            if(isbreak && num[i])
                isbreak=0;
        }
        if(isbreak)
            break;
        //放置6*6的包裹
        res+=num[5];
        //放置5*5的包裹,填充1*1的
        res+=num[4];
        int shengyu1=num[4]*11;
        //放置4*4的包裹,填充2*2,1*1的
        res+=num[3];
        int shengyu2=5*num[3];
        //放置3*3的包裹,填充2*2,1*1的
        res+=num[2]/4;
        num[2]%=4;
        if(num[2]==1)
        {
            res++;
            shengyu2+=5;
            shengyu1+=7;
        }
        else if(num[2]==2)
        {
            res++;
            shengyu2+=3;
            shengyu1+=6;
        }
        else if(num[2]==3)
        {
            res++;
            shengyu2+=1;
            shengyu1+=5;
        }
        //放置2*2的包裹,填充1*1的
        if(num[1]<=shengyu2)  //2*2的全部被填充
        {
            shengyu2-=num[1];
            num[1]=0;
            shengyu1 = shengyu1+4*shengyu2;
            shengyu2=0;
        }
        else
        {
            num[1]-=shengyu2;
            shengyu2=0;
            res+=num[1]/18;
            num[1]%=18;
            if(num[1]) res++;
            shengyu1 = 36-num[1]*4;
        }
        //放置1*1的包裹
        if(num[0]<=shengyu1) //1*1的全部被填充
        {
            shengyu1-=num[0];
            num[0]=0;
        }
        else
        {
            num[0]-=shengyu1;
            shengyu1=0;
            res+=num[0]/36;
            num[0]%=36;
            if(num[0]) res++;
        }
        cout << res << endl;
    }
}

第二题的代码可以从以下几点再进行优化,以上面这种方式写结构清楚:

1.res=res+num[5]+num[4]+num[3]+(num[2]+3)/4;//加3是为了向上取整

2.shengyu2=num[3]*5+7-2*(num[2]%4?7:num[2]%4);

3.shengyu1=num[4]*11+7-(num[2]%4?7:num[2]%4)+4*shengyu2;

欢迎大家批评指正!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值