王道计算机考研机试指南刷题笔记-自用3

| 2.2 模拟

3.其他模拟

例题2.9 KY25(清华大学复试上机题)

剩下的树__牛客网 (nowcoder.com)

1、总结

  • 遇到的坑:直接把给出的区间右端点值减去左端点值+1得到这个区间移走的树,再把所有区间移走的树相加。手算的时候发现给的样例输出不对,还没意识到问题出在哪。
  • 看解析中提到了区间重叠的情况,恍然大悟。
  • 用一个flag数组记录每个位置树的存在与否,循环的时候先判断该位置是否有树。

2、源代码

#include <stdio.h>

int main() {
    int l,m;
    while( scanf("%d %d\n",&l,&m) != EOF) {
        int flag[l]; // 记录对应位置的树
        int tree = l+1;  // 初始树的数量
        for ( int i = 0 ; i <= l ; i++ ) {  // 初始化
            flag[i] = 1;
        }
        while( m > 0 ) {
            m--;
            int left,right;  //左右区间
            while ( scanf("%d %d\n",&left,&right) != EOF ) {
                for ( int i = left ; i <= right ; i++ ) {
                    if( flag[i] == 1 ) {//对应位置有树,数量-1
                        tree--;
                        flag[i] = 0;
                    }
                    
                }
            }
        }
        printf("%d\n",tree);
    }
}

例题2.11 KY132 

xxx定律__牛客网 (nowcoder.com)

挺简单的,一次AC。发现次数自加写在循环体开头比循环体最后更节省空间。

源代码:

#include <stdio.h>

int main() {
    int n;
    while ( scanf("%d\n",&n ) != EOF ) {
        int count = 0; // 经过的步数
        while ( n != 1 ) {  // n不等于1时循环
            count++;
            if ( n%2 == 0 ) { // n为偶数
                n /= 2;
            } else {
                n = (3*n+1)/2;  // n为奇数
            }
            // count++;
        }
        printf("%d\n",count);
    }
}

习题2.9 KY120(浙大复试上机题)

Grading_牛客题霸_牛客网 (nowcoder.com)

1、思路

  • 评分规则乍一看有点复杂,细分为两大步判断。
  • step1:| G1-G2 | 与 T 的大小关系(两种)
  • step2:| G3-G1 | 、| G3-G2 | 与T的大小关系(三种)
  • 求三个数中的最大值函数:用三元表达式三行解决
  • 判断两个数的差可以用绝对值函数abs
  • 输出格式控制:一位小数%.1f

2、总结

  • 第一次提交只通过了一半用例,仔细检查了一遍if-else判断的逻辑,感觉没问题。以为是求三个数中的最大数函数出了问题,用if-else语句重写了一遍,发现还是只能通过一半。
  • 看解答发现是求平均值的时候没有进行类型转换。定义的时候除了最后分数都是int型,求平均值的时候没有强制转换成float型,因此后面的用例都没法通过(结果都是x.0)。
  • 第二次成功AC。

3、源代码

#include <stdio.h>
#include <stdlib.h>

// 求三个数中的最大值
int get_Max(int a,int b,int c) {
    int max1 = a >= b ? a : b;
    int max = max1 >= c ? max1 : c;
    return max;
}

int main() {
    int p,t,g1,g2,g3,gj;
    while ( scanf("%d %d %d %d %d %d\n",&p,&t,&g1,&g2,&g3,&gj) != EOF ) {
        float score;
        // 1.g1和g2的差在公差t范围内
        if ( abs( g1 - g2 ) <= t ) {
            score = (float)( g1 + g2 )/2;
        } else {  // g1和g2的差大于t
            int g13 = abs( g3 - g1 );  // g3和g1的差
            int g23 = abs( g3 - g2 );  // g3和g2的差
            if ( g13 <= t && g23 <= t ) {
                score = get_Max(g1,g2,g3);
            } else if ( g13 > t && g23 > t ) {
                score = gj;
            } else {
                if ( abs( g3 - g1 ) <= abs( g3 - g2 ) ) {
                    score = (float)( g3 + g1 )/2;
                } else {
                    score = (float)( g3 + g2 )/2;
                }
            }
        }
        printf("%.1f\n",score);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值