第一题: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.csdn.net/acm_ted/article/details/8022419