PKU Helper 招新面试二

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 100000
using 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值