二下题目的解析

二下的题比二上简单不少(但最后一个题没让做)

第一个题我用的之前括弧匹配的原理,凭着自己的感觉,反正做了一遍就对了,

这个题最主要的是输入时括弧不会输,

如果输入的数后面既没有空格,有没有回车,那只能用%s:

char a[10000]

scanf("%s",a);

其中从a【0】到最后,每一个a【】都存一个字符

如果需要一个字符,却不知道他的代号,可以调试一遍,然后找出字符对应的数。

我的思想:如果为左括号(以下称为左),那使其进站,若为右括号(以下简称右),那若站不为空,则栈顶退站,如果站已空,则将右变为左,最后站有几个元素,就在变元素/2次。

附上代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int zhan[100004],top=0,yao=0;
char a[100004];
int main(){
freopen("shower.in","r",stdin);
freopen("shower.out","w",stdout);
scanf("%s",a);
for(int j=0;j>=0;j++)
{if(a[j]=='(')
{top++;
zhan[top]=1;
}
if(a[j]==')')
{if(zhan[top]==1)
top--;
else {
if(top!=0)
{yao++;
top--;
}
else {
top++;
yao++;
zhan[top]=1;
}
}
}
if(a[j]!='('&&a[j]!=')')
break;
}
printf("%d",yao+top/2);
return 0;
}

第二题我的想法能满分来,结果我第一次为了图省事,把输入复制到了输出上了,结果最后in忘改成out了,

然后在测试时数组开小了(我还以为10的6次方为10w呢,结果是100w)

有的时候,程序本不能优化,硬要优化,反而错了。

附上代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int T,N[2002],k[2002],zhi[1000003],ma=0,q=0,he,ji=0,mi=1000000;
bool a[1000003];
int main(){
freopen("diary.in","r",stdin);
freopen("diary.out","w",stdout);
scanf("%d",&T);
//某法求质数
memset(a,0,sizeof(a));
memset(zhi,0,sizeof(zhi));
a[1]=1;
for(int i=1;i<=T;i++)
{scanf("%d%d",&N[i],&k[i]);
if(ma<N[i]) ma=N[i];
if(mi>k[i]) mi=k[i]; }
for(int i=2;i<=ma;i++)
if(a[i]==0){

ji++;
zhi[ji]=i;
for(int j=i*i;j<=ma;j=j+i)
{if(i*i<=0) break;
a[j]=1;
}
}
for(int ii=1;ii<=T;ii++){
ma=0;
for(int i=1;i<=N[ii];i++)
{he=0;
for(int j=i;j<i+k[ii];j++)
he+=zhi[j];
if(he>ma&&he<=N[ii])
ma=he;
if(he>N[ii])
break;
}
if(ma==0) printf("-1\n");
if(ma>0) printf("%d\n",ma);

}
fclose(stdin);
fclose(stdout);
return 0;
}

 

优化:找出N/k的值,再用二分找出他在指数表的最近的指数的位置,这个数加后面k-1个数,若>n,则最后一个数去掉,找前一个数,重复此过程直至<=n;

则此时为最大。

 

posted on 2017-11-05 21:08  醉强王者  阅读(73)  评论(0)    收藏  举报

导航