PKU Helper 招新面试二

来源:互联网 发布:知乎 大泽佑香 编辑:程序博客网 时间:2024/06/08 12:51

T3
Google Kickstart Round E:完成其中任何一道题目即可。当然,如果你全部完成我们也非常欢迎~

前一篇招新面试一的续集。10.15截止初试,于是ddl压身的可怜的我基本是在最后一天开始动笔QAQ先跳过第二题看的是第三题,看到了之后蛮开心的因为这场Google Kickstart是我玩过的唯一一场,因为完全是想试一试题目所以三个小时期间其实还睡了一个小时hhhhh

当时的战绩【天惹那么水你都好意思晒出来

Google Kickstart

然而如你们所见,并没有完成任何一道题目QAQ
哇的一声哭了出来QAQ

//Problem A. Copy & Paste#include<iostream>#include<string>#include<queue>using namespace std;struct node{    int now,len;    //now表示迄今为止相等的位数    //len表示转化长度    string board;    node(int innow=0,int inlen=0,string inboard=""):now(innow),len(inlen),board(inboard){}};bool operator<(const node &a, const node &b){    return a.len>b.len;} int main(){    freopen ("A-large.in", "r", stdin);      freopen ("A-large.out", "w", stdout);     int T=0;    string S;    cin>>T;    for (int t=1;t<=T;t++)    {        cin>>S;        int slen=S.length();        priority_queue<node> nodelist;        node new_node(1,1,"");        node top_node;        nodelist.push(new_node);        while (!nodelist.empty())        {            top_node=nodelist.top();            nodelist.pop();            if (top_node.now==slen) break;            new_node=top_node;            new_node.len++;            new_node.now++;            nodelist.push(new_node);            //在末尾增加一位            new_node=top_node;            new_node.len++;            int boardlen=new_node.board.length();            if (boardlen>0 && boardlen+new_node.now<=slen)            {                bool flag=true;                for (int  i=0;i<boardlen;i++)                    if (S[i+new_node.now]!=new_node.board[i]) flag=false;                if (flag)                {                    new_node.now+=boardlen;                    nodelist.push(new_node);                    //把board中的内容粘贴到串中                }            }            new_node=top_node;            new_node.len++;            for (int i=0;i<new_node.now;i++)            {                for (int j=i+1;j<new_node.now;j++)                    //剪切要有意义,至少board中要有两位                {                    new_node.board=S.substr(i,j-i+1);                    // 从第i位开始的长度为j的字符串                                      nodelist.push(new_node);                            //改变剪贴板                }            }               }        cout<<"Case #"<<t<<": "<<top_node.len<<endl;    }    return 0;}
//Problem C. Blackhole#include<iostream>using namespace std;struct node{    double x[3];};int main(){    freopen ("C-small-attempt2.in", "r", stdin);      freopen ("C-small-attempt2.out", "w", stdout);     int T=0;    cin>>T;    for (int t=1;t<=T;t++)    {        node nodelist[3];        double radius=0;        double xmin=0,xmax=0;        for (int i=0;i<3;i++)        {            for (int j=0;j<3;j++)            {                cin>>nodelist[i].x[j];            }        }        xmin=min(nodelist[0].x[0],nodelist[1].x[0]);        xmin=min(xmin,nodelist[2].x[0]);        xmax=max(nodelist[0].x[0],nodelist[1].x[0]);        xmax=max(xmax,nodelist[2].x[0]);        radius=(xmax-xmin)/6;        cout<<"Case #"<<t<<": ";        printf("%.9lf\n",radius);        //<<radius<<endl;    }    return 0;}

我看了下Board第一页的前30人就没有同时做出A和C的large Case的,倒是B都是全刷过了…我也很无奈啊为何我当时做的不是B呢。最刺激的是C的large就过了三个人正端坐在前三名,于是我决定还是看A吧起码还有戏一点的样子23333

下载了A large的13:46过的那位大神的代码学习一下,发现人家是666啊,应该算是个帅气的动归?

学习一下之后的结果

#include<iostream>#include<string>#define MAXI 100000using namespace std;void solve(){    char s[MAXI];    int mini[305][305][305];    string str;    memset(mini,127/3,sizeof(mini));    cin>>(s+1);    s[0]='#';    str="@"+string(s+1);    int n=strlen(s+1);    mini[0][0][0]=0;    for (int i=0;i<=n;i++)    {        int mii=mini[i][0][0];        for (int j=1;j<=i;j++)        {            for (int r=1;j+r-1<=i;r++)            {                mii=min(mii,mini[i][j][r]);            }        }        for (int j=1;j<=i;j++)        {            for (int r=1;j+r-1<=i;r++)            {                mini[i][j][r]=min(mini[i][j][r],mii+1);            }        }        if (i==n)        {            printf("%d\n",mii);            return;        }        mini[i+1][0][0]=min(mini[i+1][0][0],mini[i][0][0]+1);        for (int j=1;j<=i;j++)        {            for (int r=1;j+r-1<=i;r++)            {                mini[i+1][j][r]=min(mini[i+1][j][r],mini[i][j][r]+1);            }        }        for (int i=0;j<=i;j++)        {            int ml=0;            while (s[i+1+ml]==s[j+ml]) ml++;            for (int k=0;k<=ml;k++)                mini[i+k][j][k]=min(mini[i+k][j][k],mini[i][j][k]+1);        }    }}int main(){    int T;    cin>>T;    for (int i=1;i<=T;i++)        printf("Case #%d: ",i),sol();    return 0;}
原创粉丝点击