比赛:字符串的各种用法,背包DP,二分,树形dp,位运算...
c++用法学习:
1.向上取整:头文件<cmath>,用于浮点数向上最近取整数。
#include <cmath>
double input = 12.34;
int rounded_up = std::ceil(input);
// 输出结果:rounded_up现在是13
2.强制类型转换:static_cast<>(<>为转换类型);
3.哈希表:unordered_map和unordered_set
unordered_set是一组没有重复数字的无序容器。
插入和查找的平均复杂度基本在o(1)。
#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
// 创建一个空的unordered_set,存储整数类型数据
unordered_set<int> mySet;
// 插入元素
mySet.insert(10);
mySet.insert(20);
mySet.insert(30);
// 遍历并打印所有元素
for (const auto& value : mySet) {
cout << value << " ";
} // 输出:10 20 30(具体顺序可能不同,因为unordered_set内部是无序的)
// 检查某个元素是否存在
if (mySet.count(20)) {
cout << "20 exists in the set." << std::endl;
}
// 删除元素
mySet.erase(10);
// 清空整个集合
mySet.clear();
return 0;
}
3.字符串用法:string s;
getline(cin,s)
- 特点:可以读取一行完整的文本,包括空格、换行符等特殊字符。
- 适用场景:当需要接收包含空格或多个单词的完整句子时。
cin >> s
- 特点:从标准输入流读取直到遇到空白字符(如空格、制表符、换行符),然后停止读取。
- 适用场景:适合获取单个单词或者整数类型的输入,不适合读取包含空格的完整句子。
find_first_not_of
函数用于在一个序列(如字符串、容器等)中查找第一个不匹配给定字符集的元素。
s.insert(pos, "Inserted");
在指定位置插入子串。
s.erase(pos, n);
删除从pos开始的n个字符。
s.pop_back();
删除最后一个字符。
size_t found = s.find("World");
查找子串第一次出现的位置,返回其索引,找不到则返回
string::npos .
found = s.rfind("World");
同上,但从前向后查找最后一次出现的位置。
s.replace(pos, n, "Replacement");
替换从pos开始的n个字符为指定的新字符串。
toupper(c) 把字符转为大写,可以配合transform使用
tolower(c) 转为小写
string s = "hello, world!";
for (char& c : str) {
c = toupper(c);
}
//或者
transform(str.begin(), str.end(), str.begin(),toupper);
4.二分函数
定义有序数组 vector<int>a;
binary_search(a.begin(),a.end(),value);
- 函数用于判断给定的值
value
是否存在于一个有序范围内(升序或降序)。 - 如果找到,则返回
true
;否则返回false
。 - 不返回元素的位置,只是确认元素是否存在。
lower_bound(a.begin(),a.end(),value);
- 返回第一个大于或等于
value
的元素的迭代器位置。 - 如果所有元素都小于
value
,则返回last
。 - 可以用来找出特定值应该被插入到已排序序列中的正确位置。
upper_bound(a.begin(),a.end(),value);
- 返回第一个大于
value
的元素的迭代器位置。 - 如果所有元素都不大于
value
,则返回last
。 - 可以用来找出特定值之后的第一个元素在已排序序列中的位置。
动态规划:背包问题是对n个体积不同价值不同的物品选取不超过背包体积的最优解,对于每个物品,拿和不拿进行选择。将大问题拆分成子问题,并进行记录。
#include<iostream>
using namespace std;
const int MAXN = 100; // 物品数量
const int W = 100; // 背包容量
int dp[W+1]; // dp[i]表示容量为i时的最大价值
struct Item {
int value, weight;
};
void knapsack(Item items[], int n, int w) {
// 初始化dp数组
for (int i = 0; i <= w; ++i) {
dp[i] = 0;
}
// 状态转移方程
for (int i = 0; i < n; ++i) {
for (int j = w; j >= items[i].weight; --j) { // 倒序遍历,因为物品不可分割
dp[j] = max(dp[j], dp[j - items[i].weight] + items[i].value);
}
}
cout << "背包能装下的最大价值: " << dp[w] << endl;
}
int main() {
Item items[MAXN];
int n = 5; // 物品数量,根据实际输入设定
int w = 20; // 背包容量,根据实际问题设定
// 这里省略了对items数组的初始化...
knapsack(items, n, w);
return 0;
}