2015北邮计算机考研复试上机题解

第一题:求导数


描述:求函数f(x) = a*x^3 + b*x^2 + c*x + dx = x0处的一阶导数。

输入:a b c d x0

输出:f'(x0)

样例输入:1 1 1 1 1

样例输出:6


直接输出3ax*x+2bx+c即可。


代码:

#include<iostream>
using namespace std;

int main()
{
    int tes;
    while(cin>>tes)
    {
        int a,b,c,d,x0;
        while(tes--)
        {
            int res;
            cin>>a>>b>>c>>d>>x0;
            res=3*a*x0*x0+2*b*x0+c;
            cout<<res<<endl;
        }
    }
    return 0;
}

/*
5
1 1 1 1 1
*/

 

第二题:LIST


描述:在该LIST上实现3种操作

         1append x在该LIST末尾添加xx32位整数

         2pop删除该LIST末尾的数

         3find i寻找第i个数,若i为负数表示寻找倒数第i个数,例如i = -1表示寻找倒数第一个

输入:第一行输入一个m,表示有m条操作,接下来每行输入一条操作

输出:输出find i找到的数


直接数组模拟即可:


代码:

#include<iostream>
#include<cstring>
#define maxn 1005
using namespace std;
int a[maxn];

int main()
{
    int tes;

    char tmp[15];
    while(cin>>tes)
    {
        int m;
        while(tes--)
        {
            cin>>m;
            int len=0;
            int d;
            while(m--)
            {
                cin>>tmp;
                if(strcmp(tmp,"append")==0)
                {
                    cin>>d;
                    a[++len]=d;
                }
                else if(strcmp(tmp,"find")==0)
                {
                    cin>>d;
                    if(d>0)
                    {
                        cout<<a[d]<<endl;
                    }
                    else
                    {
                        d=-d;
                        cout<<a[len+1-d]<<endl;
                    }
                }
                else
                    len--;
            }
        }
    }
    return 0;
}

/*
2
5
append 1
append 2
find 1
find -1
pop
6
append 1
append 2
append 3
append 4
find -2
find 2
*/

 

第三题:图像压缩存储


描述:以二维数组表示图像,其值只有01两种,寻找两幅图像中最大的相同部分

输入:第一行输入一个n,接下来的2n行输入两个n * n数组,寻找一个最大的m * m子区域,使得两个数组在该子区域完全相同

输出:输出上诉m

样例输入:

              4

              1 1 1 1

              1 1 1 0

              1 1 1 0

              1 1 1 1

              0 1 1 1

              0 1 1 1

              0 1 1 1

              0 1 1 0

样例输出:

              2

解释:上诉两个4阶数组中的一个2阶子区域(第12行,第23列完全相同)


题目大意:题目所要求的是两个矩阵最大的相同部分。


解题思路:

可以将两个矩阵直接异或(^)出来。

0异或0等于0

1异或1等于0

0异或1等于1

(相同异或为0,不同异或为1)

两个矩阵异或之后取非。

然后题目就变成了求第三个矩阵里的最大的为1的方阵。

我们可以采用动态规划的思想。

首先从左到右遍历一次寻找每个点可以向左延伸到最远的距离

然后从上到下遍历一次寻找每个点可以向上延伸到最远的距离

最后直接从左上角到右下角。看直接能到最左上角的距离

就是每个点可以延伸最大的方阵的边长。


代码:

#include<iostream>
#include<cstring>
#define maxn 1005
using namespace std;
int a[maxn][maxn];
int dp1[maxn][maxn];    //从左到右
int dp2[maxn][maxn];    //从上到下
int dp3[maxn][maxn];    //从左上角到右下角
int n;

int mi(int a,int b)
{
    if(a<b) return a;
    return b;
}

int ma(int a,int b)
{
    if(a<b) return b;
    return a;
}

int main()
{
    int tes;

    int i,j;
    while(cin>>tes)
    {
        while(tes--)
        {
            cin>>n;

            for(i=1; i<=n; i++)
                for(j=1; j<=n; j++)
                    scanf("%d",&a[i][j]);

            int tmp;
            for(i=1; i<=n; i++)
                for(j=1; j<=n; j++)
                {
                    scanf("%d",&tmp);
                    a[i][j]=!(a[i][j]^tmp);
                }

            for(i=1; i<=n; i++)
            {
                dp1[i][0]=0;
                for(j=1; j<=n; j++)
                {
                    if(a[i][j]==1)
                        dp1[i][j]=dp1[i][j-1]+1;
                    else
                        dp1[i][j]=0;
                }
            }

            for(i=1; i<=n; i++)
            {
                dp2[0][i]=0;
                for(j=1; j<=n; j++)
                {
                    if(a[j][i]==1)
                        dp2[j][i]=dp2[j-1][i]+1;
                    else
                        dp2[j][i]=0;
                }
            }

            dp3[0][0]=0;

            int res=0;
            for(i=1; i<=n; i++)
                for(j=1; j<=n; j++)
                {
                    int t=dp3[i-1][j-1];
                    t=mi(t,dp1[i][j-1]);
                    t=mi(t,dp2[i-1][j]);
                    if(a[i][j]==1)
                        dp3[i][j]=t+1;
                    else
                        dp3[i][j]=0;
                    res=ma(res,dp3[i][j]);
                }

            cout<<res<<endl;
            /*
            cout<<"*********************"<<endl;
            for(i=1;i<=n;i++)
            {
            	for(j=1;j<=n;j++)
            	{
            		printf("%d",a[i][j]);
            	}
            	printf("\n");
            }
            cout<<"*********************"<<endl;
            for(i=1;i<=n;i++)
            {
            	for(j=1;j<=n;j++)
            	{
            		printf("%d",dp3[i][j]);
            	}
            	printf("\n");
            }
            */
        }
    }
    return 0;
}

/*
2
4
1 1 1 1
1 1 1 0
1 1 1 0
1 1 1 1
0 1 1 1
0 1 1 1
0 1 1 1
0 1 1 0
*/

 

第四题:解析表达式


描述:输入一个字符串形式的表达式,该表达式中包括整数,四则运算符(+-*/),括号,三角函数(sin(x)cos(x)tan(x)),底数函数(lg(x)ln(x)),计算该表达式的值

输入:输入一个字符串形式的表达式,保证中间及最终结果不超出double的范围

输出:表达式的值,保留6位小数

样例输入:

             3

             3+5

             ((2-1)*5-1)*6

             1+cos(0)

             sin(sin(1-1))

样例输出:

             3.000000

             8.000000

             24.000000

             2.000000

             0.000000


据说15年的这个题目当时上机没有一个人AC掉。

然后只有三十多人做出来三道题。


我之前在上数据结构实验课的时候写过类似的一道题目。不过里面没有sin,cos,tan函数。不过我的输入里面可以自带小数。

有兴趣的可以再在代码上改改。不难。

但是在两个小时以内能全部把这4道题AC掉确实有点困难。


代码:

#include<iostream>
#include<cstring>
#include<cmath>
#include<stack>
using namespace std;
int i,j,k,start,end;

double to_double(char x[])
{
    int l;
    double p=0;
    if(strlen(x)==1)
        return (x[0]-'0');
    int len=strlen(x);
    int tt=len;
    for(l=0; l<len; l++)
        if(x[l]=='.')
        {
            tt=l;
            break;
        }

    for(l=0; l<tt; l++)
        p=p*10+(x[l]-'0');
    for(l=tt+1; l<len; l++)
        p+=(x[l]-'0')*pow(0.1,l-tt);
    return p;
}

int prior(char a,char b)
{
    if((b=='(')||(a=='(')||((a=='+'||a=='-')&&(b=='*'||b=='/')))
        return 0;
    else if(((a=='+'||a=='-'||a=='*'||a=='/')&&(b=='+'||b=='-'))||((a=='*'||a=='/')&&(b=='*'||b=='/'))||b==')')
        return 1;
    else
        return 0;
}

double calculate(double a,double b,char c)
{
    if(c=='+')
        return a+b;
    else if(c=='-')
        return a-b;
    else if(c=='*')
        return a*b;
    else
        return a/b;
}

int main()
{
    char a[1004];

    while(cin>>a)
    {
        stack <double> fig;
        stack <char> cal;
        int len=strlen(a);
        for(i=0; i<len; i++)
        {
            int fg1=0;
            int fg2=0;
            while((a[i]>='0'&&a[i]<='9')||a[i]=='.')
            {
                if(fg1==0)
                    start=i;
                fg1=1;
                end=i;
                i++;
                if(i>=len)
                    fg2=1;
            }

            if(fg1)
            {
                char x[104];
                k=0;
                for(j=start; j<=end; j++,k++)
                    x[k]=a[j];
                x[k]='\0';
                double p=to_double(x);
                fig.push(p);
            }

            if(fg2)
                break;
            if(cal.empty())
            {
                cal.push(a[i]);
                continue;
            }
            else if(prior(cal.top(),a[i])==0)
            {
                cal.push(a[i]);
                continue;
            }

            else if(a[i]!=')'&&prior(cal.top(),a[i])==1)
            {
                double b=fig.top();
                fig.pop();
                double a=fig.top();
                fig.pop();
                char c=cal.top();
                cal.pop();
                double x=calculate(a,b,c);
                fig.push(x);
                i--;
                continue;
            }


            else if(a[i]==')')
            {
                while(cal.top()!='(')
                {
                    double b=fig.top();
                    fig.pop();
                    double a=fig.top();
                    fig.pop();
                    char c=cal.top();
                    cal.pop();
                    double x=calculate(a,b,c);
                    fig.push(x);
                }
                cal.pop();
                continue;
            }
        }

        while(!(cal.empty()))
        {
            double b=fig.top();
            fig.pop();
            double a=fig.top();
            fig.pop();
            char c=cal.top();
            cal.pop();
            double x=calculate(a,b,c);
            fig.push(x);
        }

        printf("%.6f\n",fig.top());
    }

    return 0;
}

/*
3
3+5
((2-1)*5-1)*6
(100-(2.0+4.4)*5)*0-(5*4+2.05-(2+1.0))/2
*/


你可能感兴趣的:(计算机,考研)