title: 算法学习刷题记录-210717
tags:

  • 算法
  • acwing
  • 每日一题
    abbrlink: 4a21f2a
    date: 2021-07-17 12:29:08

3768. 字符串删减 - AcWing题库

思路

双指针的练习

C++代码

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. int main()
  6. {
  7. int n;
  8. string s;
  9. cin>>n>>s;
  10. int res=0;
  11. for(int i=0;i<n;i++)
  12. {
  13. if(s[i]!='x') continue;
  14. int j=i+1;
  15. while(j<n && s[j]=='x') j++;
  16. res+=max(0, j-i-2);
  17. i=j-1;
  18. }
  19. cout<<res<<endl;
  20. return 0;
  21. }

3769. 移动石子 - AcWing题库

思路

经典的贪心移动石子问题

C++代码

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. int main()
  6. {
  7. int T;
  8. cin>>T;
  9. while(T--)
  10. {
  11. int n,d;
  12. cin>>n>>d;
  13. int res=0;
  14. for(int i=0;i<n;i++)
  15. {
  16. int x;
  17. cin>>x;
  18. if(!i) res+=x;
  19. else
  20. {
  21. int t=min(x, d/i);
  22. res+=t;
  23. d-=t*i;
  24. }
  25. }
  26. cout<<res<<endl;
  27. }
  28. return 0;
  29. }

3761. 唯一最小数 - AcWing题库

思路

哈希表

代码

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N = 200010;
  6. int n;
  7. int w[N], cnt[N];
  8. int main()
  9. {
  10. int T;
  11. cin>>T;
  12. while(T--)
  13. {
  14. cin>>n;
  15. memset(cnt, 0, (n+1) * 4);
  16. for(int i=0;i<n;i++)
  17. {
  18. cin>>w[i];
  19. cnt[w[i]]++;
  20. }
  21. int res=-1;
  22. for(int i=0;i<n;i++)
  23. {
  24. if(cnt[w[i]]==1)
  25. {
  26. if(res==-1 || w[res] > w[i])
  27. res=i;
  28. }
  29. }
  30. if(res!=-1) res++;
  31. cout<<res<<endl;
  32. }
  33. return 0;
  34. }

3762. 二进制矩阵 - AcWing题库

思路

找规律,每操作三次就可以改变一个方格内的值而不影响其他方格的值,题目未要求最优解,所以以此为据直接进行枚举即可

代码

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N = 110;
  6. int n, m;
  7. char g[N][N];
  8. void pL(int i, int j, int k)
  9. {
  10. if (!k) printf("%d %d %d %d %d %d\n", i, j, i + 1, j, i, j + 1);
  11. else if (k == 1) printf("%d %d %d %d %d %d\n", i, j - 1, i, j, i + 1, j);
  12. else if (k == 2) printf("%d %d %d %d %d %d\n", i - 1, j, i, j, i, j - 1);
  13. else printf("%d %d %d %d %d %d\n", i - 1, j, i, j, i, j + 1);
  14. }
  15. int main()
  16. {
  17. int T;
  18. cin >> T;
  19. while (T -- )
  20. {
  21. cin >> n >> m;
  22. int res = 0;
  23. for (int i = 1; i <= n; i ++ )
  24. {
  25. cin >> g[i] + 1;
  26. for (int j = 1; j <= m; j ++ )
  27. if (g[i][j] == '1')
  28. res += 3;
  29. }
  30. cout << res << endl;
  31. for (int i = 1; i <= n; i ++ )
  32. for (int j = 1; j <= m; j ++ )
  33. if (g[i][j] == '1')
  34. {
  35. if (i < n && j < m)
  36. pL(i, j, 0), pL(i, j + 1, 1), pL(i + 1, j, 3);
  37. else if (i == n && j == m)
  38. pL(i, j, 2), pL(i - 1, j, 1), pL(i, j - 1, 3);
  39. else if (i == n)
  40. pL(i, j, 3), pL(i - 1, j, 0), pL(i, j + 1, 2);
  41. else
  42. pL(i, j, 1), pL(i, j - 1, 0), pL(i + 1, j, 2);
  43. }
  44. }
  45. return 0;
  46. }

3767. 最小的值 - AcWing题库

思路

贪心

代码

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N = 110;
  6. int n;
  7. int a[N], b[N];
  8. int main()
  9. {
  10. cin>>n;
  11. for(int i=0;i<n;i++) cin>>a[i];
  12. for(int i=0;i<n;i++) cin>>b[i];
  13. int x=0, y=0;
  14. for(int i=0;i<n;i++)
  15. if(a[i]<b[i]) x++;
  16. else if(a[i] > b[i]) y++;
  17. if(!y) puts("-1");
  18. else cout<<(x+y)/y<<endl;
  19. return 0;
  20. }