目录
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
题目描述
运行代码
#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;
}
代码思路
-
定义了一个结构体
Segment
来表示线段,包含两个端点的坐标x1
、y1
、x2
、y2
。 -
Intersect
函数用于判断两条线段是否相交:- 通过计算线段的方程参数
a1
、b1
、c1
和a2
、b2
、c2
。 - 计算行列式
det
,如果det
为0
,则两线段平行或共线,返回false
。 - 计算交点的坐标
x
和y
。 - 然后检查交点是否在两条线段的范围内,如果在范围内则返回
true
,表示相交;否则返回false
。
- 通过计算线段的方程参数
-
count
函数用于计算给定线段集合中的交点数量:- 通过两层循环遍历线段集合,对于每对不同的线段,调用
Intersect
函数判断是否相交,如果相交则交点数量加1
。
- 通过两层循环遍历线段集合,对于每对不同的线段,调用
-
在
main
函数中:- 不断读取输入的线段数量
n
,只要n
不为0
就继续处理。 - 对于每个线段数量,创建一个
vector
来存储线段。 - 读取每条线段的端点坐标,并将其添加到
vector
中。 - 调用
count
函数计算交点数量,并输出结果。
- 不断读取输入的线段数量
HDU1087——Super Jumping! Jumping! Jumping!
题目描述
运行代码
#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;
}
代码思路
-
首先定义了变量
n
,用于接收输入的整数,表示数字的个数。通过一个while
循环,只要输入的n
不为0
,就继续处理。 -
定义了一个
vector<long long>
类型的数组a
来存储输入的数字,通过一个循环读取n
个数字并存储到a
中。 -
初始化结果变量
ans
为a[1]
,并定义了一个同长度的vector<long long>
类型的数组dp
用于动态规划计算。 -
初始化
dp[1]
为a[1]
。 -
从第
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]
中的最大值。
- 先将
-
最后输出
ans
,即能得到的最大结果。
HDU1088——Write a simple HTML Browser
题目描述
运行代码
#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;
}
代码思路
-
定义了一个字符串
a
用于存储输入的单词或 HTML 标签,以及一个整数count
用于记录当前行已经输出的字符数。 -
通过一个
while
循环不断读取输入的字符串a
。 -
当输入的字符串
a
为<br>
时,直接换行,并将count
重置为0
。 -
当输入的字符串
a
为<hr>
时,如果当前行不是开头(即count
不为0
),先换行,然后输出 80 个-
字符,再换行,并将count
重置为0
。 -
对于其他的输入字符串:
- 如果加上当前已输出的字符数
count
和这个字符串的长度以及一个空格(表示分隔)的长度不超过 80 ,则根据count
是否为0
决定是否在前面添加空格后输出该字符串,并更新count
。 - 如果超过 80 ,则先换行,再输出该字符串,并将
count
更新为该字符串的长度。
- 如果加上当前已输出的字符数
-
最后在循环结束后,再输出一个换行符。