每日OJ刷题

简介: 每日OJ刷题

2001.计算两点之间的距离

题目描述

Problem Description:输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。

Input:输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。

Output:对于每组输入数据,输出一行,结果保留两位小数

Sample Input

0 0 0 1

0 1 1 0

Sample Output

1.00

1.41

运行代码

#include <iostream>    
#include <cmath>   
#include <iomanip>
using namespace std;
int main() {
    double x1, y1, x2, y2; 
    while (cin >> x1 >> y1 >> x2 >> y2) { 
        double d = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2)); 
        cout << fixed << setprecision(2) << d << endl;
    }
    return 0;
}

代码思路

数学公式的计算

2002.计算球的体积

题目描述

运行代码

#include <iostream>  
#include <iomanip> 
#include<cmath>
using namespace std;
const double PI = 3.1415927;
int main() {
    double r;
    while (cin >> r) {
        double V = (4.0 / 3.0) * PI * pow(r, 3);
        cout << fixed << setprecision(3) <<V << endl;
    }
    return 0;
}

代码思路

球的体积公式V = (4/3) * π * r^3

2041.超级楼梯

题目描述

运行代码

#include <iostream>
#include <vector>
using namespace std;
int Stairs(int M) {
    if (M==1||M== 2) return 1;
    vector<int> dp(M + 1); 
    dp[1] = 1;
    dp[2] = 1;
    for (int i = 3; i <= M; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }
    return dp[M]; 
}
int main() {
    int N;
    cin >> N; 
    while (N--) {
        int M;
        cin >> M; 
       cout << Stairs(M) << endl; 
    }
    return 0;
}

代码思路

动态规划(Dynamic Programming, DP)的方法来解决经典的“爬楼梯问题”。解题思路如下:

  1. 问题定义:给定一个楼梯有M级台阶,每次可以跨1级或2级,求到达第M级台阶的所有不同走法。
  2. 边界条件处理:当M等于1时,只有1种走法,即直接走1级。当M等于2时,有两种走法,分别是走两次1级或直接走1次2级。
  3. 状态定义与转移方程:定义状态:dp[i] 表示到达第i级台阶的不同走法数量。状态转移方程:到达第i级台阶的走法可以通过从第i-1级台阶走1步到达,也可以通过从第i-2级台阶走2步到达,因此 dp[i] = dp[i-1] + dp[i-2]
  4. 初始化:由于dp[1]dp[2]是基础情况,它们都初始化为1。
  5. 计算过程:通过一个循环,从3开始迭代到M,依次计算出dp[i]的值,直到求得dp[M]
  6. 输出结果:对于每一个测试实例,程序读入M值后,调用Stairs(M)函数计算并输出走法数量。

2042.不容易系列之二

题目描述

运行代码

#include <iostream>
using namespace std;
int main() {
    int N;
    cin >> N; 
    while (N--) {
        int a;
        cin >> a; 
        int s = 3; 
        for (int i = 0; i < a; ++i) {
            s= (s- 1) * 2; 
        }
        cout << s << endl;
    }
    return 0;
}

代码思路

通过逆向思维来解决,即从市场返回到起点,反向考虑每次经过收费站时羊的数量变化。每次经过收费站,实际上羊的数量会变为原来的两倍再加一(因为退还了一只羊)。因此,我们可以从最后剩余的羊的数量开始,反向计算原始的羊的数量。

首先读取测试实例的个数N,然后对于每个实例,读取经过的收费站数量a,并从终点的3只羊开始,反向通过每个收费站计算原始的羊的数量。每次反向“通过”收费站时,都将当前的羊的数量减一后乘以2,这是因为原本的计算逻辑是在过站时先减半再加一,逆向时则需要做对应的逆运算。最终,它输出每个实例中老汉最初拥有的羊的数量。

目录
相关文章
|
7月前
|
人工智能
刷题之Leetcode977题(超级详细)
刷题之Leetcode977题(超级详细)
24 0
|
7月前
刷题之Leetcode54题(超级详细)
刷题之Leetcode54题(超级详细)
33 0
|
7月前
leetcode344刷题打卡
leetcode344刷题打卡
28 0
|
7月前
|
索引
leetcode242刷题打卡
leetcode242刷题打卡
27 0
|
7月前
|
算法
leetcode28刷题打卡
leetcode28刷题打卡
32 0
|
存储 Java 测试技术
leetcode刷题(6)
各位朋友们大家好,今天是我的leetcode刷题系列的第六篇。这篇文章将与队列方面的知识相关,因为这些知识用C语言实现较为复杂,所以我们就只使用Java来实现。
|
算法 API C++
|
算法 测试技术 C++