T3
Google Kickstart Round E:完成其中任何一道题目即可。当然,如果你全部完成我们也非常欢迎~
前一篇招新面试一的续集。10.15截止初试,于是ddl压身的可怜的我基本是在最后一天开始动笔QAQ先跳过第二题看的是第三题,看到了之后蛮开心的因为这场Google Kickstart是我玩过的唯一一场,因为完全是想试一试题目所以三个小时期间其实还睡了一个小时hhhhh
当时的战绩【天惹那么水你都好意思晒出来
然而如你们所见,并没有完成任何一道题目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;
}