A Digits Sum

题目大意

S(x)为x各个位上的数的和,问在1~n这n个数中有多少个数满足S(x + 1) < S(x)

主要思路

只有发生进位才会满足S(x + 1) < S(x),统计9,19,29..等个数即可

AC代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define debug(a) cout << #a << " = " << a << endl;
  5. #define x first
  6. #define y second
  7. typedef pair<int, int> P;
  8. const int N = 200010;
  9. int n;
  10. int a[N];
  11. signed main(void)
  12. {
  13. int T;
  14. cin >> T;
  15. while(T--)
  16. {
  17. cin >> n;
  18. int res = 0;
  19. res = n / 10;
  20. if(n % 10 == 9) res++;
  21. cout << res << endl;
  22. }
  23. return 0;
  24. }

B Reverse String

题目大意

给一个字符串s,一个字符串t,问能否通过在任意位置先向右遍历s一个长度(可以为0),再向左遍历一个长度(可以为0)来得到字符串t

主要思路

找到s[i] == t[0]的位置枚举向右遍历的长度,由于t字符串长度固定,那么向左的长度也能确定,将字符串拼接判断是否等于t即可,模拟

AC代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define debug(a) cout << #a << " = " << a << endl;
  4. #define x first
  5. #define y second
  6. typedef pair<int, int> P;
  7. const int N = 200010;
  8. int n;
  9. int main(void)
  10. {
  11. int T;
  12. cin >> T;
  13. while(T--)
  14. {
  15. string s1, s2;
  16. cin >> s1 >> s2;
  17. int x = s1.find(s2);
  18. if(x != -1) puts("YES");
  19. else
  20. {
  21. bool flag = false;
  22. for(int i = 0; i < s1.size(); i++)
  23. {
  24. if(s1[i] == s2[0])
  25. {
  26. string s = "";
  27. for(int len = 0; len < s2.size(); len++)//枚举长度
  28. {
  29. s.clear();
  30. int pos;
  31. for(int j = i; j <= i + len && j < s1.size(); j++)//先向右
  32. {
  33. s += s1[j];
  34. pos = j;
  35. }
  36. pos--;
  37. while(pos >= 0 && s.size() != s2.size())//再向左
  38. {
  39. s += s1[pos];
  40. pos--;
  41. }
  42. if(s == s2)
  43. {
  44. flag = true;
  45. break;
  46. }
  47. }
  48. }
  49. }
  50. if(flag) puts("YES");
  51. else puts("NO");
  52. }
  53. }
  54. return 0;
  55. }

C Penalty

题目大意

两队一人一球踢点球,1表示进球,0表示没进球,?表示未知,问能否通过修改?为1或0来让点球用最少的局数结束,当1队的进球数+剩余局数 < 另一队进球数时结束

主要思路

一共只有10局比赛,我们统计?个数,枚举每一种情况判断即可

或者考虑由于求局数最小,则让?全为1或者全为0取局数最小值即可

AC代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define debug(a) cout << #a << " = " << a << endl;
  5. #define x first
  6. #define y second
  7. typedef pair<int, int> P;
  8. const int N = 200010;
  9. int n;
  10. int ans;
  11. int f(string s, int st, int n)
  12. {
  13. int cnt = 0;
  14. for(int i = 0; i < s.size(); i++)
  15. {
  16. if(s[i] == '?')
  17. {
  18. if((st >> cnt) & 1)
  19. {
  20. s[i] = '1';
  21. }
  22. else s[i] = '0';
  23. cnt++;
  24. }
  25. }
  26. int t1 = 0, cnt1 = 5;
  27. int t2 = 0, cnt2 = 5;
  28. for(int i = 0; i < 10; i++)
  29. {
  30. if(s[i] == '1' && i % 2 == 0) t1++;
  31. else if(s[i] == '1' && i % 2 == 1) t2++;
  32. if(i % 2 == 0) cnt1--;
  33. else cnt2--;
  34. if(t1 + cnt1 < t2)
  35. {
  36. return i + 1;
  37. }
  38. else if(t2 + cnt2 < t1)
  39. {
  40. return i + 1;
  41. }
  42. }
  43. return (int)10;
  44. }
  45. signed main(void)
  46. {
  47. int T;
  48. cin >> T;
  49. while(T--)
  50. {
  51. int ans = 11;
  52. string s;
  53. cin >> s;
  54. int cnt = 0;
  55. for(int i = 0; i < s.size(); i++)
  56. {
  57. if(s[i] == '?') cnt++;
  58. }
  59. for(int i = 0; i < 1 << cnt; i++)
  60. {
  61. ans = min(ans, f(s, i, cnt));
  62. }
  63. cout << ans << endl;
  64. }
  65. return 0;
  66. }

D Backspace

题目大意

给一个字符串s和一个字符串t,每次可以写入一个字符或者删除上一个输入的字符(如果上一个没输入字符则不用删除,相当于不输入当前字符),问能否通过s得到字符串t

主要思路

考虑从前往后遍历,如果s[i] == t[j]那么i++, 否则i += 2,这样我们最后还得考虑剩余的字符串是否是偶数个,如果是奇数则不成立。

于是我们考虑从后往前遍历,如果s[i] == t[j]那么i—, 否则i -= 2,这样在匹配成功时不需考虑最后剩余字符数为奇数还是偶数,全部删除即可

AC代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. int T;
  6. cin >> T;
  7. while(T--)
  8. {
  9. string s, t;
  10. cin >> s >> t;
  11. for(int i = s.size() - 1; i >= 0; i--)
  12. {
  13. if(s[i] == t.back()) t.pop_back();
  14. else i--;
  15. if(t.size() == 0) break;
  16. }
  17. if(t.size() == 0) puts("YES");
  18. else puts("NO");
  19. }
  20. return 0;
  21. }