string

输入

cin>>str; 或 getline(cin,str);

迭代器

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); 字符转大写

贪心

在对问题求解时,总是做出在当前看来是最好的选择
使用前提:局部最优解一定能导致全局最优解

  1. // 渡河问题
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. int n,ans; // 每一组的最短的渡河时间
  5. int a[10000];
  6. void f(int m,int a[]){ // 贪心策略的函数
  7. int left = m;
  8. while(left > 0){
  9. if(left == 1){
  10. ans+= a[1];
  11. break;
  12. }else if(left == 2){
  13. ans+= a[2];
  14. break;
  15. }else if(left == 3){
  16. ans+= a[3] + a[2] + a[1];
  17. break;
  18. }else{
  19. // 1,2出发,1返回,最后两名出发,2返回
  20. int s1 = a[2] + a[1] + a[left] + a[2]; // a[left]没两次都是最大的时间
  21. // 1,3出发,1返回,14出发,1返回,12过河
  22. int s2 = a[left] + a[left - 1] + 2 * a[1];
  23. ans+= min(s1,s2);
  24. left-= 2;
  25. }
  26. }
  27. }
  28. int main(){
  29. int t;
  30. cin >> t;
  31. for(int i = 1;i <= t;++i){ // t组人
  32. cin >> n; // 每组的人数
  33. for(int i = 1;i <= n;++i){
  34. cin >> a[i];// 每一组每个人的渡河时间
  35. }
  36. sort(a+1,a+n+1);// 升序排序
  37. f(n,a);
  38. cout << ans;
  39. memset(a,0,sizeof(a)); // 初始化数组
  40. ans = 0;
  41. }
  42. return 0;
  43. }
  1. // 导弹拦截
  2. #include <iostream>
  3. using namespace std;
  4. int a[1010]; // 存当前已经有的能够拦截导弹的系统数量 下标就是系统数量 元素 就是 当前系统拦截的最高高度
  5. int n;
  6. int k = 0;// 代表已经有的拦截系统的数量
  7. int main(){
  8. // 思路: 在当前拦截系统中 找高度最矮的系统来拦截导弹 如果没有能拦截的 就再开一个 如果有能拦截的 就找到
  9. // 第一个能拦截的(最矮的)系统进行拦截 把 这个系统的高度修改成当前的导弹高度
  10. // 处理导弹的时候 输入一个处理一个
  11. cin >> n;
  12. int x;// 飞来的导弹高度
  13. // int p = -1; // 假设没有找到
  14. for(int i = 1;i <= n;i ++){
  15. cin >> x;
  16. int p = -1; // 每一次都要找
  17. // 循环a数组 找
  18. for(int j = 1;j <= k; j ++){
  19. if(a[j] >= x){
  20. p = j;
  21. break;
  22. }
  23. }
  24. // 如果没有找到
  25. if(p == -1){
  26. k ++;
  27. a[k] = x; // 更新拦截系统的最高高度
  28. }else{
  29. a[p] = x; // 找到了 修改当前系统的最高高度
  30. }
  31. }
  32. cout << k << endl;
  33. return 0;
  34. }

指针

指针就是变量的地址
& 取一个地址的值 取一个值的地址
调用指针时:p是指针变量,
p是指针指向的值
p++; 代表指针增加,不是指针指向的值增加
借助指针可以修改变量的值

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. void fun(int a[],int n){
  4. for(int i = 0;i < n;i ++){
  5. cout << a[i] << " ";
  6. }
  7. cout << endl;
  8. }
  9. void fun1(int *a,int n){
  10. for(int i = 0;i < n;i ++){
  11. //cout << a[i] << " ";
  12. cout << *a << " "; // 输出下标为0的地址 存储的元素
  13. a ++; // 地址++;
  14. }
  15. cout << endl;
  16. }
  17. void fun3(char s[]){ // 传入的是字符数组
  18. for(int i = 0;i < strlen(s);i ++){
  19. cout << s[i] << " ";
  20. }
  21. cout << endl;
  22. }
  23. void fun4(char *s){ // 传入的是字符数组的地址
  24. while(*s != '\0'){ //字符数组 是以‘\0’为结尾的
  25. cout << *s << " ";
  26. s ++;
  27. }
  28. cout << endl;
  29. }
  30. int main(){
  31. int a[5] = {10,20,30,50,40};
  32. // 通过指针 输出 数组的元素 或者 字符串
  33. fun(a,5);
  34. fun1(a,5);
  35. // 字符串
  36. char s[100] = "hello";
  37. fun3(s);
  38. fun4(s);
  39. return 0;
  40. }
  41. /* 输出:
  42. 10 20 30 50 40
  43. 10 20 30 50 40
  44. h e l l o
  45. h e l l o
  46. */
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct st{ //定义了st结构体
  4. int num;
  5. string name;
  6. double h;
  7. };
  8. int main()
  9. {
  10. // 能定义整数指针类型 就能定义 结构体指针类型
  11. st s; // 定义 st结构体类型 变量 s
  12. s.num = 1;
  13. s.name = "xiaoming";
  14. s.h = 178.6;
  15. cout << s.num << " " << s.name << " " << s.h << endl;
  16. st *p = &s; //定义结构体指针 指向 st结构体 变量s
  17. // -> 指针->成员名 ->表示 指向
  18. cout << p->num << " " << p->name << " " << p->h << endl;
  19. // p 指针 *p 是结构体
  20. cout << (*p).num << " " << (*p).name << " " << (*p).h << endl;
  21. return 0;
  22. }
  23. /* 输出:
  24. 1 xiaoming 178.6
  25. 1 xiaoming 178.6
  26. 1 xiaoming 178.6
  27. */