1.握手问题:
思路:首先当所有人都握过手,由于一次握手相当于两个人都握手过,所以容易发现这是一个组合问题,为(50*49)/2,而其中有7个人没有相互握过手,那么减去(7*6)/2,结果为1204.
2.小球反弹:
思路:如果直接按照题意画路径会发现很复杂,也比较难直接找到打到角落的条件,这时候可以想到化曲为直,复杂问题简单化,在初中的时候学过光的反射,也画过镜子的光路图,按镜面对称不会改变光的路程,这里也是一样的,把左面扩展开来,最终当dx和dy分别是343720和233333的倍数即可。
细节:
1) 如何对浮点数四舍五入至保留两位小数?直接看很难找到相应的函数,但是我们可以想到round 它的功能是找到一个与浮点数最近的整数,比如2.77离3近,则为3,2.11离 2近,则为2。如果我们将一个数先乘100,用round操作之后再除以100,岂不是可以达到四舍五入保留两位小数的效果了?
2) 还有sum最后再用勾股定理算比较合适,因为要算斜边又一直直角边比例是要用到开方的,而sqrt只能用于double型数据, 而验证是否符合条件时又要用到%,会冲突。
-
cout 会以科学计数法输出浮点数,而fixed会强制输出小数格式。
-
std::setprecision(n)
-
它会设置小数点后保留的位数。
-
如果
n
小于浮点数的实际小数位数,多余的位数会被截断(不会四舍五入)。 -
如果
n
大于浮点数的实际小数位数,多余的位数会显示为0。
-
#include <bits/stdc++.h>
using namespace std;int main() {long long t = 1, x = 343720, y = 233333;// 找到满足条件的最小 twhile (1) {if ((15 * t) % x == 0 && (17 * t) % y == 0)break;t++;}// 计算路径长度double path_length = 2 * sqrt(15 * 15 * t * t + 17 * 17 * t * t);// 四舍五入到两位小数double ans = round(path_length * 100) / 100;// 输出结果cout << fixed << setprecision(2) << ans << endl;return 0;
}