| 2.2 模拟
3.其他模拟
例题2.9 KY25(清华大学复试上机题)
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
挺简单的,一次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);
}
}