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;
}


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


华为债见。你不不过五百强!

posted @ 2016-04-05 13:38  mengfanrong  阅读(271)  评论(0编辑  收藏  举报