第二轮算法模拟试卷(2020.10.28)
这套试卷总体简单,主要有些思想自己还需要掌握下。关于存储问题,和动态规划的边界条件自己要多注意下。以及如何写注释。
- 关于1.3.2 2.3.5的输入问题:
scanf("%d.%d.%d %d.%d.%d",&X1,&Y1,&Z1,&X2,&Y2,&Z2);
- 输入A,B,N,要求输出A/B的结果保留N位小数
/*算法思想:本质是就是要我们模拟手动进行除法运算。两数相除,计算余数,余数进位(即乘以10)后继续作除法运算。
为什么不用double?
主要还是为由于对于太多位小数,double不精确
这题需要掌握:
1、如何进行除法运算。进行到小数点的后位
2、明白,小数的后几位,并不是一起输出出来的,而是一个,一个计算,再一个一个printf的。
*/
for(int j=0;j<N+1;j++)
{
/*Compute quotient and remainder*/
Quo=A/B;
Res=A%B;
A=Res*10;
/*Judge whether to odd"."on Output*/
if(j==0)
{
printf("%d",Quo);
}
else
{
printf("%d",Quo);
}
}
printf("\n");
- 关于求读入N名学生的成绩,将获得某一给定分数的学生人数输出
/*
算法思想:我们可以先开一个A[101]的数组,然后在读入学生的成绩的时候,进行计数。当需要学生的成绩的时候,再读取出来。时间复杂度要比直接用暴力搜索要快很多。同时也不需要单独开一个数组来存储学生的成绩。
这道题目,需要掌握:
1、这种计数的思想
2、对于数组进行初始化
*/
/*Set the number of Score as 0*/
for(int i=0;i<=100;i++)
{
ScoreNum[i]=0;
}
/*Input Score*/
for(int i=0;i<N;i++)
{
scanf("%d",&X);
ScoreNum[X]++;
}
-
关于走棋盘,只能走日型(类似于象棋中的马),要求从一个坐标走到另一个坐标的最少步数。
-
求最大子序列
/*
算法思想:只考虑正数能让这段区间的和增大,那么当某一DP[i]为负数的时候,我们在进行区间扩大的时候就抛弃这个转移变量。在每次进行状态转移的时候更新最大值,最后把最大值输出
需要掌握:
1、我们在进行写转移方程之前,最好是先画图,画表格,把题目理解清楚。
2、这里是不管你加不加上前面的数据,它自己本身就有个初值
*/
...
/*Initial the array of DP*/
for(int i=0;i<N;i++)
Dp[i]=X[i];
/*Intial Start and MaxNum*/
MaxNum=Dp[0];
/*Main Loop*/
for(int i=0;i<N;i++)
{
if(Dp[i-1]>0)
Dp[i]+=Dp[i-1];
if(Dp[i]>MaxNum)
MaxNum=Dp[i];
}
/*Output result*/
printf("%d\n",MaxNum);
return 0;