• WaterAngle题解Contest806div4


    A : 判断这个字符是不是yes的意思,直接转为大写或者小写判断即可

    1. #include
    2. using namespace std;
    3. signed main() {
    4. int T;
    5. cin >> T;
    6. while (T--) {
    7. string s;
    8. cin >> s;
    9. for (int i = 0; i < s.length(); i++) {
    10. s[i] = tolower(s[i]);
    11. }
    12. if (s == "yes") {
    13. cout << "YES";
    14. } else
    15. cout << "NO";
    16. cout << '\n';
    17. }
    18. return 0;
    19. }

    B :一次解决保底获得一个气球,所以总共保底获得n个气球,另外首次获得ans++,初始化一个bool 类型的数组存放是否首次解决。

    1. #include
    2. using namespace std;
    3. bool f[30];
    4. signed main() {
    5. int T;
    6. cin >> T;
    7. while (T--) {
    8. for (int i = 0; i <= 26; i++) {
    9. f[i] = false;
    10. }
    11. int n;
    12. cin >> n;
    13. string s;
    14. cin >> s;
    15. int ans = 0;
    16. for (int i = 0; i < n; i++) {
    17. if (!f[s[i] - 'A']) {
    18. ans++;
    19. }
    20. f[s[i] - 'A'] = true;
    21. }
    22. printf("%d\n", ans + n);
    23. }
    24. return 0;
    25. }

    C : 纯模拟,既然给出的是最后密码锁上的数字,那么久对给出的操作反向计算,U就是减,D就是加,最后对每一步操作规定边界,不能超过9也不能为负数。

    1. #include
    2. using namespace std;
    3. const int N = 110;
    4. int pas[N];
    5. signed main() {
    6. int T;
    7. cin >> T;
    8. while (T--) {
    9. int n;
    10. cin >> n;
    11. for (int i = 0; i < n; i++) {
    12. cin >> pas[i];
    13. }
    14. for (int j = 0; j < n; j++) {
    15. int op, opn = 0;
    16. string x;
    17. cin >> op >> x;
    18. for (int i = 0; i < op; i++) {
    19. if (x[i] == 'U') {
    20. pas[j]--;
    21. }
    22. if (x[i] == 'D') {
    23. pas[j]++;
    24. }
    25. if (pas[j] < 0) {
    26. pas[j] += 10;
    27. }
    28. pas[j] %= 10;
    29. }
    30. }
    31. for (int i = 0; i < n; i++) {
    32. cout << pas[i] << ' ';
    33. }
    34. cout << '\n';
    35. }
    36. return 0;
    37. }

    D : 哟西,这道题之后好好看看STL。

            想到了是要用map来解决,但是当时不会用,没看过这部分内容。知识储备量太少了 呜呜。

            存放每个单词到map,然后我们枚举分割点,这样就生成了两个单词,然后查找这两个单词是否在map里面

    1. #include
    2. using namespace std;
    3. const int N = 1e5 + 10;
    4. bool v[N];
    5. string s[N];
    6. signed main() {
    7. int T;
    8. cin >> T;
    9. while (T--) {
    10. int n;
    11. cin >> n;
    12. memset(v, 0, n + 1);
    13. mapbool> m;
    14. for (int i = 1; i <= n; i++) {
    15. cin >> s[i];
    16. m[s[i]] = true;
    17. }
    18. for (int i = 1; i <= n; i++) {
    19. int l = s[i].length();
    20. for (int j = 0; j < l; j++) {
    21. string x, y;
    22. for (int k = 0; k < j; k++) {
    23. x += s[i][k];
    24. }
    25. for (int k = j; k < l; k++) {
    26. y += s[i][k];
    27. }
    28. if (m[x] && m[y]) {
    29. v[i] = 1;
    30. }
    31. }
    32. }
    33. for (int i = 1; i <= n; i++) {
    34. cout << v[i];
    35. }
    36. cout << '\n';
    37. }
    38. return 0;
    39. }

    E : 旋转这个矩阵之后,选择要不要改变这个位置,要么全变1要么全变0。计算下是边0步骤少还是1。

            旋转 90 °,x 变为原本的y,y变为上一次的x-n+1

           此后的旋转同理。

            ans/4 或者枚举一半的矩阵,后者会快些。

    1. #include
    2. using namespace std;
    3. const int N = 110;
    4. int a[N][N];
    5. void solve() {
    6. int n;
    7. cin >> n;
    8. for (int i = 1; i <= n; i++) {
    9. string s;
    10. cin >> s;
    11. s = " " + s;
    12. for (int j = 1; j <= n; j++) {
    13. a[i][j] = s[j] - '0';
    14. }
    15. }
    16. int ans = 0;
    17. for (int i = 1; i <= n; i++) {
    18. for (int j = 1; j <= n; j++) {
    19. int sum = 0;
    20. int nowi = i, oldi = i, nowj = j, oldj = j;
    21. sum += a[nowi][nowj];
    22. nowi = oldj;
    23. nowj = n - oldi + 1;
    24. oldi = nowi;
    25. oldj = nowj;
    26. sum += a[nowi][nowj];
    27. nowi = oldj;
    28. nowj = n - oldi + 1;
    29. oldi = nowi;
    30. oldj = nowj;
    31. sum += a[nowi][nowj];
    32. nowi = oldj;
    33. nowj = n - oldi + 1;
    34. oldi = nowi;
    35. oldj = nowj;
    36. sum += a[nowi][nowj];
    37. ans += min(sum, 4 - sum);
    38. }
    39. }
    40. cout << ans / 4 << '\n';
    41. }
    42. signed main() {
    43. int T;
    44. cin >> T;
    45. while (T--) {
    46. solve();
    47. }
    48. return 0;
    49. }

    F : 找到i , j 可以使

                                            a[i] < i < a[j] < j

            统计一下到 i 之前有多少个数字满足 a[i] < i 的,存放在 s[i] 里面。

            在满足 a[j] < j  的情况下,如有配对,那么 i <= a[j]-1 ,而且i  < j ,对于  i < a[j]-1 的情况都已经包含在 s[a[j]-1]里了,所以 ans += ;

    1. #include
    2. #define int long long
    3. using namespace std;
    4. const int N = 2e5 + 10;
    5. int arr[N], v[N], s[N];
    6. signed main() {
    7. int T;
    8. cin >> T;
    9. while (T--) {
    10. memset(s, 0, sizeof(s));
    11. memset(v, 0, sizeof(v));
    12. int n;
    13. cin >> n;
    14. for (int i = 1; i <= n; i++) {
    15. cin >> arr[i];
    16. if (arr[i] < i) {
    17. v[i] = 1;
    18. }
    19. s[i] = s[i - 1] + v[i];
    20. }
    21. int ans = 0;
    22. for (int i = 1; i <= n; i++) {
    23. if (v[i])
    24. ans += s[arr[i] - 1];
    25. }
    26. cout << ans << '\n';
    27. }
    28. return 0;
    29. }

  • 相关阅读:
    2023 | 组蛋白乳酸化如何影响免疫、自噬最新发现!
    MATLAB算法实战应用案例精讲-【智能优化算法】算术优化算法-AOA(附matlab代码)
    禁用adb install 安装app功能
    vue3基础知识
    美团三面:让你怀疑人生的Spring Boot夺命连环40问
    【系统架构设计】架构核心知识: 3.3 DSSA和ABSD
    Web前端学习笔记6(transform-style,flex)
    内容互动性的提升策略:Kompas.ai的智能工具
    网站构建初级教程
    Django+Celery框架自动化定时任务开发
  • 原文地址:https://blog.csdn.net/SSL_BPT/article/details/125889774