目录
HDU1020——Encoding
题目描述
运行代码
#include <iostream>
#include <string>
using namespace std;
int main() {
int k;
cin >> k;
while (k--) {
string c;
cin >> c;
int j = 1;
for (size_t i = 0; i < c.size(); ++i) {
if (i + 1 < c.size() && c[i] == c[i + 1]) {
j++;
}
else {
if (j == 1) {
cout << c[i];
}
else {
cout << j << c[i];
}
j = 1;
}
}
cout << '\n';
}
return 0;
}
代码思路
-
读取测试用例数量:首先,代码读取一个整数
k
,表示将要处理的字符串数量。 -
处理每个测试用例:对于每一个字符串,执行以下操作:
- 读取一个字符串
c
。 - 初始化一个计数器
j
,用于记录当前字符的连续重复次数。 - 使用一个
for
循环遍历字符串中的每个字符。- 如果当前字符与下一个字符相同,增加计数器
j
。 - 否则,如果当前字符与下一个字符不同:
- 如果计数器
j
等于1,说明字符没有重复,直接输出该字符。 - 否则,输出计数器
j
和当前字符,表示字符重复的次数和字符本身。 - 重置计数器
j
为1,准备计数下一个字符的重复次数。
- 如果计数器
- 如果当前字符与下一个字符相同,增加计数器
- 完成一个字符串的处理后,输出一个换行符
\n
,以便区分不同的字符串输出。
- 读取一个字符串
HDU1021——Fibonacci Again
题目描述
运行代码
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int FN(int n) {
if (n == 0)
return 7;
if (n == 1)
return 11;
int a = 7, b = 11, c;
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return b;
}
int main() {
int n;
while (cin >> n) {
int num = FN(n);
if ((n-2)%4==0) {
cout << "yes" << endl;
}
else {
cout << "no" << endl;
}
}
return 0;
}
代码思路
-
FN函数:这个函数实现了斐波那契数列的一个变体。斐波那契数列通常定义为
F(0)=0
,F(1)=1
,之后每一项都是前两项的和。但在这个变体中,起始的两个数分别是7
和11
,即FN(0)=7
和FN(1)=11
,之后每一项FN(n)
等于FN(n-1)+FN(n-2)
。 -
主函数 main:
- 主函数首先读取一个整数
n
,这个n
代表了想要查询的斐波那契变体数列的第n
项。 - 然后调用
FN(n)
函数计算该数列的第n
项的值。 - 接下来,代码检查
n-2
是否能被4
整除(即(n-2) % 4 == 0
),如果成立,则输出yes
,否则输出no
。
- 主函数首先读取一个整数
根据FN函数推断出n的规律,进行总结归纳。
HDU1022——Train Problem I
题目描述
运行代码
#include <iostream>
#include <stack>
#include <string>
using namespace std;
bool Trains(const string& inOrder, const string& outOrder) {
stack<int> station;
int inIndex = 0, outIndex = 0;
while (outIndex < outOrder.size()) {
if (!station.empty() && station.top() == outOrder[outIndex] - '0') {
station.pop();
outIndex++;
}
else if (inIndex < inOrder.size()) {
station.push(inOrder[inIndex] - '0');
inIndex++;
}
else {
return false;
}
}
return station.empty();
}
void Steps(const string& inOrder, const string& outOrder) {
stack<int> station;
int inIndex = 0, outIndex = 0;
cout << "Yes." << endl;
while (outIndex < outOrder.size()) {
if (!station.empty() && station.top() == outOrder[outIndex] - '0') {
cout << "out" << endl;
station.pop();
outIndex++;
}
else if (inIndex < inOrder.size()) {
cout << "in" << endl;
station.push(inOrder[inIndex] - '0');
inIndex++;
}
}
cout << "FINISH" << endl;
}
int main() {
int num;
string inOrder, outOrder;
while (cin >> num >> inOrder >> outOrder) {
if (Trains(inOrder, outOrder)) {
Steps(inOrder, outOrder);
}
else {
cout << "No." <<endl << "FINISH" << endl;
}
}
return 0;
}
代码思路
-
Trains 函数:此函数用于检查是否能够按照给定的出站顺序(
outOrder
)让所有火车出站。它使用一个栈station
来模拟车站中的火车。inOrder
是火车进入车站的顺序。outOrder
是期望的火车出站顺序。- 当栈顶的火车编号与下一个应该出站的火车编号相匹配时,火车从栈中移除(出站)。
- 如果当前没有火车可以出站,那么尝试将下一辆进站的火车加入到栈中。
- 如果所有火车都已经进站并且无法完成出站顺序,函数返回
false
。 - 如果所有火车都成功出站,函数在最后会检查栈是否为空,如果为空则返回
true
。
-
Steps 函数:如果
Trains
函数返回true
,则Steps
函数会被调用来显示火车调度的具体步骤。- 它会输出每一步的操作,即火车入栈(
in
)或出栈(out
)。 - 在所有火车都出站后,输出
FINISH
。
- 它会输出每一步的操作,即火车入栈(
-
main 函数:这是程序的入口点,它读取输入并调用
Trains
和Steps
函数。- 首先读取一个
num
,这可能是测试案例的数量或者是某种与问题相关的数据,但是从代码上下文来看,它似乎没有被使用。 - 然后读取
inOrder
和outOrder
字符串,它们分别表示火车进站和期望的出站顺序。 - 对于每个案例,如果
Trains
函数返回true
,则调用Steps
函数打印出调度步骤;否则,打印"No.",表明不能按给定的顺序调度火车。
- 首先读取一个