第一题:求导数
描述:求函数f(x) = a*x^3 + b*x^2 + c*x + d在x = x0处的一阶导数。
输入:a b c d x0。
输出:f'(x0)。
样例输入:1 1 1 1 1
样例输出:6
直接输出3ax*x+2bx+c即可。
代码:
#include
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<
第二题:LIST
描述:在该LIST上实现3种操作
1、append x在该LIST末尾添加x,x是32位整数
2、pop删除该LIST末尾的数
3、find i寻找第i个数,若i为负数表示寻找倒数第i个数,例如i = -1表示寻找倒数第一个
输入:第一行输入一个m,表示有m条操作,接下来每行输入一条操作
输出:输出find i找到的数
直接数组模拟即可:
代码:
#include
#include
#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<
第三题:图像压缩存储
描述:以二维数组表示图像,其值只有0、1两种,寻找两幅图像中最大的相同部分
输入:第一行输入一个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阶子区域(第1、2行,第2、3列完全相同)
题目大意:题目所要求的是两个矩阵最大的相同部分。
解题思路:
可以将两个矩阵直接异或(^)出来。
0异或0等于0
1异或1等于0
0异或1等于1
(相同异或为0,不同异或为1)
两个矩阵异或之后取非。
然后题目就变成了求第三个矩阵里的最大的为1的方阵。
我们可以采用动态规划的思想。
首先从左到右遍历一次寻找每个点可以向左延伸到最远的距离。
然后从上到下遍历一次寻找每个点可以向上延伸到最远的距离。
最后直接从左上角到右下角。看直接能到最左上角的距离。
就是每个点可以延伸最大的方阵的边长。
代码:
#include
#include
#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>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<
第四题:解析表达式
描述:输入一个字符串形式的表达式,该表达式中包括整数,四则运算符(+、-、*、/),括号,三角函数(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
#include
#include
#include
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>a)
{
stack fig;
stack cal;
int len=strlen(a);
for(i=0; 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
*/