2014第六屆華為創新杯程式設計大賽初賽解題報告

果7發表於2014-05-11

還是忍不住想吐槽華為,吐槽華為舉辦的這個比賽。


第一場是一星比賽,水題。不過比賽為什麼在考試系統上?華為不愧是世界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;
}


華為,不愧是世界五百強,場場比賽驚心動魄,虐人心脾。我等弱渣果然沒資格走進這樣高大上的企 業。


華為債見,你不僅僅是五百強!

相關文章