第一题:求导数
描述:求函数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<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种操作
1、append x在该LIST末尾添加x,x是32位整数
2、pop删除该LIST末尾的数
3、find 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 */
第三题:图像压缩存储
描述:以二维数组表示图像,其值只有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<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 */