首页 > 试题广场 >

小红的碾压墙

[编程题]小红的碾压墙
  • 热度指数:1210 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小红是游戏《H炉》的一个主播。她经常去小红书发布关于H炉的卡牌研究攻略。

H炉有一张牌叫做碾压墙,可以消灭敌方最左边和最右边的随从,另一张牌叫做致命射击,可以随机消灭一个敌方随从。

如果小红使用两张致命射击恰好消灭了敌方最左边和最右边的随从(恰好造成了一张碾压墙的效果),就会有人在评论区发布“碾压墙” 。注意:两张致命射击的结算有先后顺序,即两张致命射击不会消灭同一个敌方随从。

现在有 n 个敌方随从,小红想知道她使用两张致命射击后,恰好造成一张碾压墙的效果的概率是多少。

输入描述:
第一行输入一个整数 n(2 \leq n \leq 10^6)


输出描述:
输出一个实数表示答案。小数点后保留10位。
示例1

输入

2

输出

1.0000000000

说明

只有两个随从,必然造成碾压墙的效果。
示例2

输入

3

输出

0.3333333333
为什么n的范围不是2 <= n <= 7(
发表于 2025-06-01 20:03:17 回复(0)
怎么说呢,这道题就是传说中的输入输出比题目本身还要难的题目
用c++写就是吃大亏了,cout不方便。
 后来换用传统技能C语言printf,秒搞定。

第一次要选到最左边或者最右边的,第二次选的和第2次相反的方向的,

所以就是 Cn2     x 2 两种可能 

/(n*(n-1)会有溢出错误(可能用long能避开),所以先除一个,再除另一个防止溢出。

#include <iostream>
using namespace std;

int main() {

    int n;
    cout.precision(8);

    while (cin >> n)
    {
        // 这难道就是传说中的输入输出比题目本身还难的题目 
        double res = ((double)2 /n) /(n - 1);
        // cout << res << endl;

        printf("%.10f", res);
    }
}
// 64 位输出请用 printf("%lld")


发表于 2025-03-27 14:59:16 回复(0)
高中数学 + 标准输入输出,标准输入输出还是要学会啊,遇到这题的时候忘记怎么写了 
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Long num = in.nextLong();
        if(num == 2) {
            System.out.printf("%.10f", 1.0000000000);            
        } else {
            Long temp = num * (num - 1);
            double res = 2.0 / temp;
            System.out.printf("%.10f", res);
        }
    }
}


发表于 2025-03-19 22:55:48 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
// public class Main {
//     public static void main(String[] args) {
//         Scanner in = new Scanner(System.in);
//         // 注意 hasNext 和 hasNextLine 的区别
//         while (in.hasNextInt()) { // 注意 while 处理多个 case
//             int a = in.nextInt();
//             int b = in.nextInt();
//             System.out.println(a + b);
//         }
//     }
// }

public class Main {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        int n = in.nextInt();
        double res = 1.0000000000;

        if (n == 2) {

            // Java 的 System.out.println 在打印 double时,会采用最短的十进制表示形式,去掉不必要的零。
            // System.out.println(res);    // 输出1.0

            System.out.printf("%.10f%n", res);
        } else {
            System.out.printf("%.10f%n", res * 2 / n / (n - 1));
        }

    }
}
发表于 2025-04-09 16:08:48 回复(0)