第一题:Parallelepiped
题意:给你一个每个面为矩形的平行六面体,告诉你交于一点的三个面的面积x,y,z,问题这个平行六面体的边长和是多少。
题解:设边长分别为a,b,c,即求解a*b=x;b*c=y;a*c=z;
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
int a,b,c,x,y,z;
scanf("%d%d%d",&x,&y,&z);
a=(int)(sqrt((double)(x*z/y))+0.000001);
b=x/a;
c=z/a;
printf("%d\n",4*(a+b+c));
return 0;
}
第二题:Array
题意:给你一个由n个数字组成的数列,问你包含k个不同的数的闭区间[l,r]是哪段,且此闭区间不存在子闭区间包含k个不同的数。存在这样的区间输出l,r,如不存在输出-1 -1。
题解:因为输出任意符合条件的答案都可,我们可以从头开始找是否存在k个不同的数,再去考查闭区间的下限。
代码:
#include<cstdio>
#include<cstring>
using namespace std;
int a[100005],flag[100005];
int main()
{
int n,k,ans=0,l,r;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i) scanf("%d",a+i);
memset(flag,0,sizeof(flag));
for(r=1;r<=n;++r)
{
if(!flag[a[r]]) ans++;
flag[a[r]]++;
if(ans==k) break;
}
for(l=1;l<=r&&flag[a[l]]>1;++l) flag[a[l]]--;
if(ans<k) l=r=-1;
printf("%d %d\n",l,r);
return 0;
}
第三题:Bracket Sequence
题意:给你一段只包含'(',')','[',']'的字符串,问哪段子串的括号匹配是正确的且包含尽可能多的'['。
题解:用num数组记录前i个字符包含'['的个数,再计算以第i个字符开始,符合条件的字符串的长度,用l数组记录,最后查找最优值。
代码:
#include<cstdio>
#include<cstring>
using namespace std;
#define M 100005
char s[M];
int num[M],l[M];
bool check(char a,char b)
{
return ((a=='('&&b==')')||(a=='['&&b==']'));
}
int main()
{
scanf("%s",s);
int len=strlen(s);
memset(l,0,sizeof(l));
num[0]=0;
for(int i=0; i<len; ++i)
num[i+1]=num[i]+(s[i]=='[');
for(int i=len-2; i>=0; --i)
{
if(s[i]==')'||s[i]==']') continue;
int idx=i+1+l[i+1];
if(check(s[i],s[idx]))
l[i]=idx-i+1+l[idx+1];
}
int ans=0,st=0;
for(int i=0; i<len; ++i)
if(ans<num[i+l[i]]-num[i])
{
ans=num[i+l[i]]-num[i];
st=i;
}
printf("%d\n",ans);
for(int i=0; i<l[st]; ++i)
printf("%c",s[st+i]);
printf("\n");
return 0;
}
第四题:
题意:给你两个字符串s和t,问是否s中存在的字母可以合成一个等于t的字符串。
题解:
代码:
#include<cstdio>
#include<cstring>
using namespace std;
#define M 200005
char s[M],t[M];
int l[M],r[M],num[35];
int main()
{
int k;
scanf("%s%s",s,t);
int la=strlen(s),lb=strlen(t);
memset(num,-1,sizeof(num));
k=0;
for(int i=0;i<la;++i)
{
if(s[i]==t[k]) ++k;
l[i]=k-1;
}
k=lb-1;
for(int i=la-1;i>=0;--i)
{
if(k>=0&&s[i]==t[k]) --k;
r[i]=k+1;
}
bool flag=true;
for(int i=0;i<la;++i)
{
if(l[i]>=0) num[t[l[i]]-'a']=l[i];
if(num[s[i]-'a']<0||num[s[i]-'a']<r[i])
{
flag=false;
break;
}
}
printf("%s\n",flag?"Yes":"No");
return 0;
}
第五题:
题意:
题解:
代码:
来源:http://blog.youkuaiyun.com/acm_ted/article/details/8022419