2014第六届华为创新杯编程大赛初赛解题报告

还是忍不住想吐槽华为,吐槽华为举办的这个比赛。


第一场是一星比赛,水题。不过比赛为什么在考试系统上?华为不愧是世界500强企业,招聘考试能走到机试的人数应该在百人左右吧。第一次举办如此大规模 的比赛还是比较紧张,参赛选手要排排队慢慢来。不过交一个题目为什么要等半个多小时才能等到结果啊?搞的人家也好紧张呀。


第一题

第一题是鸡兔同笼问题,第二题也算是个模拟吧,一星的还勉强可以接受。

样例

鸡和兔的个数,鸡和兔腿的总和

输出:

如果无解输出0 0 0

有解输出 鸡的个数 兔的个数

60分代码(满分60)

#include<iostream>
using namespace std;
int h,f,p,r,m;

int main()
{
    while (cin>>h>>f)
    {
        p=r=m=0;

        if (f>=2*h&&(f-2*h)%2==0&&(4*h>=f)&&(4*h-f)%2==0)
        {
            m=1;
            r=(f-2*h)/2;
            p=(4*h-f)/2;
        }
        cout<<m<<' '<<p<<' '<<r<<endl;
    }
    return 0;
}

/*
2 8
2 4
*/

第二题:




直接模拟即可。

100分代码(满分100):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;

char str[1000005];

struct node
{
    char add[10];
    int len;
    char val[1005];
}nod[1005];

int cmp(node p1,node p2)
{
    if(strcmp(p1.add,p2.add)<=0) return 1;
    return 0;
}

int main()
{
    int i,len,j;

    int n;

    char add[10];
    char val[1005];
    int leng;

    while(cin>>str)
    {
        n=0;
        len=strlen(str);

        int flag=0;
        for(i=0;i<len;)
        {
            int q=0;
            //cout<<i<<" i"<<endl;
            if(len-i<8)
            {
                flag=1;
                break;
            }
            for(j=i;j<=i+7;j++)
            {
                add[q++]=str[j];
            }
            add[q]='\0';
            i+=8;

            if(len-i<4)
            {
                flag=1;
                break;
            }
            leng=0;
            for(j=i;j<=i+3;j++)
            {
                int cnt=0;
                if(str[j]>='0'&&str[j]<='9')
                    cnt=str[j]-'0';
                else cnt=str[j]-'a'+10;
                leng=leng*16+cnt;
            }
            i+=4;
            leng*=2;

            if(len-i<leng)
            {
                flag=1;
                break;
            }
            q=0;
            for(j=i;j<i+leng;j++)
            {
                val[q++]=str[j];
            }
            val[q]='\0';
            i+=leng;

            strcpy(nod[n].add,add);
            //cout<<nod[n].add<<endl;
            nod[n].len=leng/2;
            strcpy(nod[n].val,val);
            n++;
        }

        sort(nod,nod+n,cmp);

        char ss[1005]="101";

        for(i=0;i<n;i++)
        {
            if(strcmp(ss,nod[i].add)!=0)
            {
                strcpy(ss,nod[i].add);
            }
            else
            {
                flag=1;
                break;
            }
        }

        if(flag==1)
        {
            puts("msgerr");
            continue;
        }

        //cout<<nod[1].len<<endl;

        //cout<<n<<endl;
        for(i=0;i<n;i++)
        {
            printf("%s%04x%s",nod[i].add,nod[i].len,nod[i].val);
        }
        printf("\n");
    }
    return 0;
}


第二场就有意思了,先看下题面。



一看就是个最水的dfs,简直侮辱智商。然后开始敲了,交了之后只有70分,惨淡的队友们纷纷爆零 ,好难过。一定是数组开小了,改大再来一发,靠,说好的不限时间、不限空间呢?内存超限又是怎么个意思? 出题人语文是数学老师教的么?于是重新读题,样例里说好的4行4列,地图给的7列是个什么意思?出题人的数学是体育老师教的么 ?算了,重新读题。国庆放假出去看朋友,一天走一个格子,咦,国庆七天假,难道七步之内走不到的 就不算?抱着这个疑问改了代码,交了一发,以为会100分,没想到又是70分。我真是个逗比。不过 华为比赛打到这一步,心理、精神都出现了某些奇怪的征兆,到底怎样才是常人的思维啊?到底怎样 才是华为的思维啊?我又重新审视题目了。发现题面上有一句话:“只能向上下左右方向其中一个方向走”会不会只能走 直线?当时我就凌乱了。真是神题。。。不过没有时间写了。好难过。有个同学写的printf(“Y\n”),这样也有60分,0分狗表示好难过。结束战斗心碎了一地。结果过了两天发短信来说我100分,可以进最后一轮了,华为你是在逗我么?


100分代码(满分100):

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;

int n,m;
char mp[1505][1505];
int visi[1505][1505];
int stax,stay,enx,eny;
int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
int flag;

void dfs(int cx,int cy,int step)
{
    if(step>8) return;
    if(flag) return;

    if(cx==enx&&cy==eny)
    {
        flag=1;
        return;
    }

    int px,py;
    for(int i=0;i<4;i++)
    {
        px=cx+dir[i][0];
        py=cy+dir[i][1];
        if(px>=0&&px<n&&py>=0&&py<m&&!visi[px][py]&&(mp[px][py]=='-'||mp[px][py]=='H'))
        {
            visi[px][py]=1;
            dfs(px,py,step+1);
            visi[px][py]=0;
        }
    }
}

int main()
{
    int i,j;

    while(cin>>n>>m)
    {
        memset(visi,0,sizeof(visi));
        //memset(cnt,0,sizeof(cnt));
        flag=0;
        for(i=0;i<n;i++)
            cin>>mp[i];

        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(mp[i][j]=='B')
                {
                    stax=i,stay=j;
                }
                else if(mp[i][j]=='H')
                {
                    enx=i;
                    eny=j;
                }
            }
        }

        //cout<<stax<<" "<<stay<<endl;
        //cout<<enx<<" "<<eny<<endl;
        visi[stax][stay]=1;
        dfs(stax,stay,1);

        if(flag) printf("Y\n");
        else printf("N\n");
    }
    return 0;
}

/*
4 7
--##---
B-----H
#---#--
-------
4 9
--##-----
B-------H
#---#----
---------
4 8
--##----
B------H
#---#---
--------
1 5
-B-H#

4 7
--##---
B-----H
#---#--
-------
*/


第三场是初赛最后一场,好吧估计脑袋正常的都被刷了,所以不怎么卡。看到题面麻将我笑了,也是 个简化的dfs,明明是原题还要改成成都麻将。。第一次交的时候没有看到输出的格式,如果输出有3 个子的话,输出3一行,然后1T4D5W类似的全部占一行。其实当时就可以拿133分的。题面说的是规则 二里面的所有的牌只有两种类型,就可以胡牌了,然后前面又说三种类型:T,D,W。然后就陷入了 怪圈,这个不叫麻将吧,但是题面说的也太含糊了。他说的意思是只能是2+4*3类似的胡,不能七对 以及其他的。但最后最让人无语的是第二组数据应然在自己在输入的时候加了一个判断如果有张牌 >=5,就输出0,这就是题面所谓的保证数据合法性,好吧,我还是太年轻了。



147分代码(满分160):

#include<cstdio>
#include<cstring>
const int maxn=27;
const char s[]="TDW";
int v[maxn],flag,ans[maxn],num;

int hash(int k,int ch)
{
    return k-1+(strchr(s,ch)-s)*9;
}

void dfs(int dep)
{
    if (dep==5)
    {
        flag=1;
        return;
    }
    else if (dep==0)
    {
        for (int i=0;i<maxn;i++)
            if (v[i]>=2)
            {
                v[i]-=2;
                dfs(dep+1);
                v[i]+=2;
            }
    }
    else if (dep<=4)
    {
        for (int i=0;i<maxn;i++)
        {
            if (v[i]>=3)
            {
                v[i]-=3;
                dfs(dep+1);
                v[i]+=3;
            }
            if ((i>=0&&i+2<9)||(i>=9&&i+2<18)||(i>=18&&i+2<27))
                if (v[i]&&v[i+1]&&v[i+2])
                {
                    v[i]--,v[i+1]--,v[i+2]--;
                    dfs(dep+1);
                    v[i]++,v[i+1]++,v[i+2]++;
                }
        }
    }
}

int checkerr()
{
    for (int i=0;i<maxn;i++)
        if (v[i]>4)
            return 1;
    return 0;
}

int main()
{
    int k;
    char ch;
    while (~scanf("%d%c",&k,&ch))
    {
        memset(v,0,sizeof(v));
        v[hash(k,ch)]++;
        for (int i=1;i<13;i++)
        {
            scanf("%d%c",&k,&ch);
            v[hash(k,ch)]++;
        }

        num=0;
        if (!checkerr())
        for (int i=0;i<maxn;i++)
            if (v[i]<4)
            {
                flag=0;
                v[i]++;
                dfs(0);
                v[i]--;
                if (flag)
                    ans[num++]=i;
            }

        printf("%d\n",num);
        if (num==0) continue;
        for (int i=0;i<num;i++)
            printf("%d%c",(ans[i])%9+1,s[ans[i]/9]);
        putchar('\n');
    }
    return 0;
}


华为,不愧是世界五百强,场场比赛惊心动魄,虐人心脾。我等弱渣果然没资格走进这样高大上的企 业。


华为债见,你不仅仅是五百强!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值