目录
7-1 考试成绩
题目
Rain Sure
同学在参加一场面试,一共有n道题目,他的初始分数为m分。
Rain Sure
回答错一道题目就会扣一分,但是分数不会小于0;回答正确一道题目就会加一分。
给定一个长度为n的字符串,第i个字符如果为o
,代表第i道题目Rain Sure
回答正确了;如果第i个字符为x
,代表第i道题目Rain Sure
同学回答错误。
请你计算他的最终分数是多少。
输入格式
第一行两个整数分别代表n和m。
第二行一个长度为n的字符串,代表Rain Sure
同学的回答情况。
1≤n≤2×105
0≤m≤2×105
保证字符串中只会出现o
和x
输出格式
请输出Rain Sure
同学的最终分数。
测试样例一
3 0
xox
0
测试样例二
20 199999
oooooooooxoooooooooo
200017
测试样例三
20 10
xxxxxxxxxxxxxxxxxxxx
0
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
栈限制8192 KB
解答
我的第一版
#include <bits/stdc++.h>
using namespace std;
int length,score;
int main(){
cin>>length>>score;
char str[length];
cin>>str[length];
for(int i=length-1;str[i];i--){
if(str[i]=='o'){
score+=1;
}
else if(str[i]=='x'){
score-=1;
}
if(score<0){
score=0;
}
}
cout<<score<<endl;
return 0;
}
改进后
#include <iostream>
using namespace std;
int main() {
int length, score;
cin >> length >> score;
string str;
cin >> str;
for (int i = 0; i < length; i++) {
if (str[i] == 'o') {
score += 1;
} else if (str[i] == 'x') {
score -= 1;
if (score < 0) {
score = 0;
}
}
}
cout << score << endl;
return 0;
}
标准答案
#include <bits/stdc++.h>
using namespace std;
int n,m;
string s;
//这里用的是string
int main(){
cin >> n >> m;
cin >> s;
for(int i=0;i<n;i++){
if(s[i]=='o') m++;
else if(m>0) m--;
//这里else if(m>0)真有操作
}
cout << m;
}
感悟
不用想的太复杂
7-2 心理阴影面积
题目
这是一幅心理阴影面积图。我们都以为自己可以匀速前进(图中蓝色直线),而拖延症晚期的我们往往执行的是最后时刻的疯狂赶工(图中的红色折线)。由红、蓝线围出的面积,就是我们在做作业时的心理阴影面积。
现给出红色拐点的坐标 (x,y),要求你算出这个心理阴影面积。
输入格式:
输入在一行中给出 2 个不超过 100 的正整数 x 和 y,并且保证有 x>y。这里假设横、纵坐标的最大值(即截止日和最终完成度)都是 100。
输出格式:
在一行中输出心理阴影面积。
友情提醒:三角形的面积 = 底边长 x 高 / 2;矩形面积 = 底边长 x 高。嫑想得太复杂,这是一道 5 分考减法的题……
输入样例:
90 10
输出样例:
4000
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
栈限制8192 KB
解答
我的代码(正确)
#include <bits/stdc++.h>
using namespace std;
int m,n;
int s1,s2,s3;
int s;
int main(){
cin>>m>>n;
s1=0.5*m*n;
s2=0.5*(100-n)*(100-m);
s3=(100-m)*n;
s=100*50-s1-s2-s3;
cout<<s<<endl;
}
答案
#include <bits/stdc++.h>
using namespace std ;
int main(){
int x,y;
cin>>x>>y;
cout<<(10000-(100-x+y)*100)/2;
return 0;
}
感悟
理想总面积:10000
在这个公式中,10000
代表的是理想情况下的总面积。假设完成度和时间都是从 0
到 100
,在时间轴上完美理想的完成度曲线将形成一个直角三角形,底边和高都是 100
,所以理想的三角形面积是:
100×1002=5000\frac{100 \times 100}{2} = 50002100×100=5000
但是在公式中用到了10000
,这表明我们实际上考虑的是两个这样的三角形(或两个面积),所以它代表的是两个理想进度三角形的总面积。你可以将其看作是“全局理想进度”的最大值。
实际偏差项:(100 - x + y)
这里的 (100 - x + y)
是实际偏差的衡量方式。我们先看看 x
和 y
是什么:
x
:当前的时间。y
:当前的完成度。
那么 100 - x + y
表示的是从时间轴和完成度的角度出发,实际进度点与理想进度的差异:
100 - x
表示的是,距离完成理想时间的剩余时间。y
表示当前的完成度。
举个例子,如果时间为 x = 80
且当前完成度为 y = 50
,那么理想进度应该是 80%
的完成度,但实际的进度是 50%
,这意味着我们比理想进度落后了。
偏差影响面积:(100−x+y)×100(100 - x + y) \times 100(100−x+y)×100
这个部分计算了与理想进度相比的差异面积。它通过偏差项 (100 - x + y)
乘以最大时间 100
来衡量,这个值是一个近似的面积表示。因为这个值是在时间维度上乘以当前完成度的差值,表示的是偏差带来的“心理阴影”的影响面积。
最终面积计算:10000−(100−x+y)×1002\frac{10000 - (100 - x + y) \times 100}{2}210000−(100−x+y)×100
- 10000是理想的总面积。
- 减去偏差带来的面积,这就是公式中的
(100 - x + y) * 100
。 - 最后,我们将这个值除以
2
,因为我们要考虑的是一个进度三角形面积的阴影部分。
总结公式
这个公式的主要思想是从理想的总面积 10000
(表示理想进度的累计)中减去一个由实际偏差衡量的面积。通过除以 2
,我们将结果调整为一个三角形面积的等价表示。这是一种简化的方式来衡量实际与理想进度之间的“心理阴影面积”。
可以想象,随着时间 x
的增加,如果完成度 y
赶不上理想进度曲线,那么 (100 - x + y)
这一项就会变大,造成更大的阴影面积,也就是公式计算出的结果会更大。
没看懂,还是我的方法易懂一点,如果有大佬看懂了可以讲一下。
未完待续