第二轮算法模拟试卷(2020.10.28)

本文介绍了三道算法模拟试题的解题思路和关键点。第一题涉及输入格式处理和模拟除法运算,强调了避免使用double以确保精度。第二题通过数组计数法优化学生分数统计。第三题是寻找最大子序列和,采用动态规划策略。这些题目都强调了理解题意、优化算法和边界条件的重要性。
摘要由CSDN通过智能技术生成

第二轮算法模拟试卷(2020.10.28)


这套试卷总体简单,主要有些思想自己还需要掌握下。关于存储问题,和动态规划的边界条件自己要多注意下。以及如何写注释。

  1. 关于1.3.2 2.3.5的输入问题:
scanf("%d.%d.%d %d.%d.%d",&X1,&Y1,&Z1,&X2,&Y2,&Z2)
  1. 输入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");

  1. 关于求读入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]++;
}
  1. 关于走棋盘,只能走日型(类似于象棋中的马),要求从一个坐标走到另一个坐标的最少步数。

  2. 求最大子序列

/*
算法思想:只考虑正数能让这段区间的和增大,那么当某一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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值