HDU1086——You can Solve a Geometry Problem too,HDU1087——Super Jumping! Jumping! Jumping!,HDU1088

38 篇文章 0 订阅

目录

HDU1086——You can Solve a Geometry Problem too

题目描述

运行代码

代码思路

HDU1087——Super Jumping! Jumping! Jumping!

题目描述

运行代码

代码思路

HDU1088——Write a simple HTML Browser

题目描述

运行代码

代码思路

HDU1086——You can Solve a Geometry Problem too

题目描述

Problem - 1086

运行代码

#include <iostream>
#include <vector>
#include<algorithm>
#include<math.h>
using namespace std;
struct Segment {
    double x1, y1, x2, y2;
};
bool Intersect(Segment s1, Segment s2) {
    double a1 = s1.y2 - s1.y1;
    double b1 = s1.x1 - s1.x2;
    double c1 = a1 * s1.x1 + b1 * s1.y1;

    double a2 = s2.y2 - s2.y1;
    double b2 = s2.x1 - s2.x2;
    double c2 = a2 * s2.x1 + b2 * s2.y1;

    double det = a1 * b2 - a2 * b1;

    if (det == 0) {
        return false;
    }

    double x = (b2 * c1 - b1 * c2) / det;
    double y = (a1 * c2 - a2 * c1) / det;

    if (x >= min(s1.x1, s1.x2) && x <= max(s1.x1, s1.x2) &&
        x >= min(s2.x1, s2.x2) && x <= max(s2.x1, s2.x2) &&
        y >= min(s1.y1, s1.y2) && y <= max(s1.y1, s1.y2) &&
        y >= min(s2.y1, s2.y2) && y <= max(s2.y1, s2.y2)) {
        return true;
    }

    return false;
}

int count(vector<Segment> segments) {
    int count = 0;
    for (size_t i = 0; i < segments.size(); ++i) {
        for (size_t j = i + 1; j < segments.size(); ++j) {
            if (Intersect(segments[i], segments[j])) {
                count++;
            }
        }
    }
    return count;
}

int main() {
    int n;
    while (cin >> n && n != 0) {
        vector<Segment> segments;
        for (int i = 0; i < n; ++i) {
            Segment s;
            cin >> s.x1 >> s.y1 >> s.x2 >> s.y2;
            segments.push_back(s);
        }
        cout << count(segments) << endl;
    }
    return 0;
}

代码思路

  1. 定义了一个结构体 Segment 来表示线段,包含两个端点的坐标 x1y1x2y2 。

  2. Intersect 函数用于判断两条线段是否相交:

    • 通过计算线段的方程参数 a1b1c1 和 a2b2c2 。
    • 计算行列式 det ,如果 det 为 0 ,则两线段平行或共线,返回 false 。
    • 计算交点的坐标 x 和 y 。
    • 然后检查交点是否在两条线段的范围内,如果在范围内则返回 true ,表示相交;否则返回 false 。
  3. count 函数用于计算给定线段集合中的交点数量:

    • 通过两层循环遍历线段集合,对于每对不同的线段,调用 Intersect 函数判断是否相交,如果相交则交点数量加 1 。
  4. 在 main 函数中:

    • 不断读取输入的线段数量 n ,只要 n 不为 0 就继续处理。
    • 对于每个线段数量,创建一个 vector 来存储线段。
    • 读取每条线段的端点坐标,并将其添加到 vector 中。
    • 调用 count 函数计算交点数量,并输出结果。

HDU1087——Super Jumping! Jumping! Jumping!

题目描述

Problem - 1087

运行代码

#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;

int main() {
    int n;
    while (cin >> n && n) {
        vector<long long> a(n + 1);
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
        }

        long long ans = a[1];
        vector<long long> dp(n + 1);
        dp[1] = a[1];

        for (int i = 2; i <= n; i++) {
            dp[i] = a[i];
            for (int j = 1; j < i; j++) {
                if (a[i] > a[j]) {
                    dp[i] = max(dp[i], dp[j] + a[i]);
                }
            }
            ans = max(ans, dp[i]);
        }
        cout << ans << endl;
    }
    return 0;
}

代码思路

  1. 首先定义了变量 n ,用于接收输入的整数,表示数字的个数。通过一个 while 循环,只要输入的 n 不为 0 ,就继续处理。

  2. 定义了一个 vector<long long> 类型的数组 a 来存储输入的数字,通过一个循环读取 n 个数字并存储到 a 中。

  3. 初始化结果变量 ans 为 a[1] ,并定义了一个同长度的 vector<long long> 类型的数组 dp 用于动态规划计算。

  4. 初始化 dp[1] 为 a[1] 。

  5. 从第 2 个数字开始,对于每个数字 a[i] :

    • 先将 dp[i] 初始化为 a[i] 。
    • 然后遍历前面的数字(从 1 到 i - 1 ),如果当前数字 a[i] 大于前面的数字 a[j] ,则更新 dp[i] 为 dp[j] + a[i] 和当前 dp[i] 中的最大值。
    • 每次处理完一个数字 i ,更新 ans 为 ans 和 dp[i] 中的最大值。
  6. 最后输出 ans ,即能得到的最大结果。

HDU1088——Write a simple HTML Browser

题目描述

Problem - 1088

运行代码

#include <iostream>
#include <string>
#include<algorithm>
using namespace std;
int main() {
    string a;
    int count = 0;
    while (cin >> a) {
        if (a == "<br>") {
            cout << endl;
            count = 0;
        }
        else if (a == "<hr>") {
            if (count) {
                cout << endl;
            }
            for (int i = 0; i < 80; ++i) {
                cout << '-';
            }
            cout <<endl;
            count = 0;
        }
        else {
            if (a.size() + count + 1 <= 80) {
                if (!count) {
                    cout << a;
                }
                else {
                    cout << " " << a;
                }
                count += a.size() + 1;
            }
            else {
                cout << endl << a;
                count = a.size();
            }
        }
    }
    cout << endl;
    return 0;
}

代码思路

  1. 定义了一个字符串 a 用于存储输入的单词或 HTML 标签,以及一个整数 count 用于记录当前行已经输出的字符数。

  2. 通过一个 while 循环不断读取输入的字符串 a 。

  3. 当输入的字符串 a 为 <br> 时,直接换行,并将 count 重置为 0 。

  4. 当输入的字符串 a 为 <hr> 时,如果当前行不是开头(即 count 不为 0 ),先换行,然后输出 80 个 - 字符,再换行,并将 count 重置为 0 。

  5. 对于其他的输入字符串:

    • 如果加上当前已输出的字符数 count 和这个字符串的长度以及一个空格(表示分隔)的长度不超过 80 ,则根据 count 是否为 0 决定是否在前面添加空格后输出该字符串,并更新 count 。
    • 如果超过 80 ,则先换行,再输出该字符串,并将 count 更新为该字符串的长度。
  6. 最后在循环结束后,再输出一个换行符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筱姌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值