string
输入
迭代器
string::iterator it;
头指针:str.begin();
尾指针:str.end();
函数
find(子串); | 查找子串第一次出现的下标,没有返回string::npos(-1) |
---|---|
find(子串,x); | 在下标x之后,查找子串 |
substr(下标i,长度len); | 截取子串,当len>字符串长度时,只取剩余的 |
substr(下标i); | 从下标i一直截取到最后 |
erase(下标i,删除长度len); | 删除下标i开始的n个字符 |
erase(开始下标i); | 删除下标i之后的所有字符 |
insert(下标i,字符串s); | 在字符串下标为i的位置插入字符串s |
replace( i,len,str ); | 从下标i开始,替换len个字符为str |
reverse(起始地址,结束地址+1); | 倒序 |
字符类型判断
(非string函数)
isdigit(c); 判断c是否为数字
isalpha(c); 判断c是否为字母
islower(c); 判断c是否为小写
isupper(c); 判断c是否为大写
字符类型转换
(非string函数)
tolower(c); 字符转小写
toupper(c); 字符转大写
贪心
在对问题求解时,总是做出在当前看来是最好的选择
使用前提:局部最优解一定能导致全局最优解
// 渡河问题
#include <bits/stdc++.h>
using namespace std;
int n,ans; // 每一组的最短的渡河时间
int a[10000];
void f(int m,int a[]){ // 贪心策略的函数
int left = m;
while(left > 0){
if(left == 1){
ans+= a[1];
break;
}else if(left == 2){
ans+= a[2];
break;
}else if(left == 3){
ans+= a[3] + a[2] + a[1];
break;
}else{
// 1,2出发,1返回,最后两名出发,2返回
int s1 = a[2] + a[1] + a[left] + a[2]; // a[left]没两次都是最大的时间
// 1,3出发,1返回,14出发,1返回,12过河
int s2 = a[left] + a[left - 1] + 2 * a[1];
ans+= min(s1,s2);
left-= 2;
}
}
}
int main(){
int t;
cin >> t;
for(int i = 1;i <= t;++i){ // t组人
cin >> n; // 每组的人数
for(int i = 1;i <= n;++i){
cin >> a[i];// 每一组每个人的渡河时间
}
sort(a+1,a+n+1);// 升序排序
f(n,a);
cout << ans;
memset(a,0,sizeof(a)); // 初始化数组
ans = 0;
}
return 0;
}
// 导弹拦截
#include <iostream>
using namespace std;
int a[1010]; // 存当前已经有的能够拦截导弹的系统数量 下标就是系统数量 元素 就是 当前系统拦截的最高高度
int n;
int k = 0;// 代表已经有的拦截系统的数量
int main(){
// 思路: 在当前拦截系统中 找高度最矮的系统来拦截导弹 如果没有能拦截的 就再开一个 如果有能拦截的 就找到
// 第一个能拦截的(最矮的)系统进行拦截 把 这个系统的高度修改成当前的导弹高度
// 处理导弹的时候 输入一个处理一个
cin >> n;
int x;// 飞来的导弹高度
// int p = -1; // 假设没有找到
for(int i = 1;i <= n;i ++){
cin >> x;
int p = -1; // 每一次都要找
// 循环a数组 找
for(int j = 1;j <= k; j ++){
if(a[j] >= x){
p = j;
break;
}
}
// 如果没有找到
if(p == -1){
k ++;
a[k] = x; // 更新拦截系统的最高高度
}else{
a[p] = x; // 找到了 修改当前系统的最高高度
}
}
cout << k << endl;
return 0;
}
指针
指针就是变量的地址
& 取一个地址的值 取一个值的地址
调用指针时:p是指针变量,p是指针指向的值
p++; 代表指针增加,不是指针指向的值增加
借助指针可以修改变量的值
#include<bits/stdc++.h>
using namespace std;
void fun(int a[],int n){
for(int i = 0;i < n;i ++){
cout << a[i] << " ";
}
cout << endl;
}
void fun1(int *a,int n){
for(int i = 0;i < n;i ++){
//cout << a[i] << " ";
cout << *a << " "; // 输出下标为0的地址 存储的元素
a ++; // 地址++;
}
cout << endl;
}
void fun3(char s[]){ // 传入的是字符数组
for(int i = 0;i < strlen(s);i ++){
cout << s[i] << " ";
}
cout << endl;
}
void fun4(char *s){ // 传入的是字符数组的地址
while(*s != '\0'){ //字符数组 是以‘\0’为结尾的
cout << *s << " ";
s ++;
}
cout << endl;
}
int main(){
int a[5] = {10,20,30,50,40};
// 通过指针 输出 数组的元素 或者 字符串
fun(a,5);
fun1(a,5);
// 字符串
char s[100] = "hello";
fun3(s);
fun4(s);
return 0;
}
/* 输出:
10 20 30 50 40
10 20 30 50 40
h e l l o
h e l l o
*/
#include <bits/stdc++.h>
using namespace std;
struct st{ //定义了st结构体
int num;
string name;
double h;
};
int main()
{
// 能定义整数指针类型 就能定义 结构体指针类型
st s; // 定义 st结构体类型 变量 s
s.num = 1;
s.name = "xiaoming";
s.h = 178.6;
cout << s.num << " " << s.name << " " << s.h << endl;
st *p = &s; //定义结构体指针 指向 st结构体 变量s
// -> 指针->成员名 ->表示 指向
cout << p->num << " " << p->name << " " << p->h << endl;
// p 指针 *p 是结构体
cout << (*p).num << " " << (*p).name << " " << (*p).h << endl;
return 0;
}
/* 输出:
1 xiaoming 178.6
1 xiaoming 178.6
1 xiaoming 178.6
*/