aixbonbon 2024-10-20 08:22 采纳率: 0%
浏览 6

01字符串排序算法运行超时问题

第一行包括两个整数n m 代表01串的长度和操作数。
第二行包括一个长度为n的01串s1…n​。
接下来m行 每行两个整数Li,Ri代表对区间[Li,Ri]排序。
输出描述
一个长度为n的01串代表答案。

样例1
输入
10 3
1111100000
2 6
4 7
7 10

输出
1010110001

提示
本题共有10个测试点。对于全部测试点 n≤100000 m≤100000。
对于测试点1 2 n=99991 且对于所有的i>1 有Li>Ri−1​。
对于测试点3 4 n=99992 LiLi​的取值最多不超过50种。
对于测试点5 6 n=99993 对于所有的i>1 有Li=Li−1​或Ri=Ri−1​。
对于测试点7 8 9 10 n=100000。

我用了快排思路 但是总是没法在1秒内完成所有的样例。程序如下:(备注:另外也试了不排序 用replace函数 也一样超时)

#include <bits/stdc++.h>
using namespace std;
 
void sort01string(string &s, int left, int right)
{
    while(left<right)//循环前提条件
        {
            char temp;
            while(left<right&&s[left]=='0')//左边遇到1之前 向右移位
                left++;
            while(left<right&&s[right]=='1')//右边遇到0之前 向左移位
                right--;
            if(left<right) //交换并计数
            {
                temp=s[left];
                s[left]=s[right];
                s[right]=temp;
            }
 
        }
}
 
int main()
{
 
 int n=0,m=0;
    cin >> n >> m;
    string s;
    cin >> s;
    int R[m]={},i=0;
    while (m--)
    {    int L=0;
           cin >> L >> R[i];
        if(i and R[i]<=R[i-1])continue;//判断本次是否不需要排序
        sort01string(s, L-1, R[i]-1);
        i++;
    };
 
    cout << s << '\n';
 
}

运行之后超时 题目要求1秒内运行完毕 现在有8个测试点都超时。后来又改成这样 还是超时。

#include <stdio.h>
#include <string.h>
 
int main()
{
  int n, m;
  char s[100001];
 
  scanf("%d%d\n%s", &n, &m, s);
  for (int i = 0, j, k, l, r; i < m; i++)
  {
    scanf("%d%d", &l, &r);
    for (j = l - 1, k = 0; j < r; j++) k += s[j] - 48;
    memset(&s[l - 1], '0', r - l - k + 1);
    memset(&s[r - k], '1', k);
  }
  printf("%s\n", s);
 
  return 0;
}

恳请帮忙指导一下。谢谢。

  • 写回答

1条回答 默认 最新

  • 无疆76 2024-10-20 08:23
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    首先,针对这个题目,输入数据的规模相当大,达到 n ≤ 100000 和 m ≤ 100000 的级别,这意味着你的排序算法的效率需要有较高的保证才能在一秒内完成任务。接下来我将按照几个部分为你提供可能的改进建议:

    输入与存储优化

    在你的代码中,输入和存储方式可以进行优化以提高效率。由于输入数据很大,频繁的内存分配和读写操作可能会导致效率下降。可以尝试以下优化:

    • 使用 scanf 进行输入而不是 cin,以提高输入速度。
    • 使用字符数组而不是 string 来存储数据,以减少内存分配和读写开销。字符数组在连续内存中的存储方式使得索引操作更快。

    算法优化

    针对排序算法的选择,可以考虑以下优化:

    • 使用更快的排序算法:虽然你使用了快速排序的变体进行排序,但在这个问题的上下文中可能并不够快。考虑到数据的特性(比如特定的测试点条件),可能需要一个更适合的算法。例如,可以利用题目给出的条件进行优化,避免不必要的排序操作。
    • 避免不必要的排序操作:根据题目的提示,对于某些测试点,区间之间可能存在重叠或者有一定的规律。如果能够识别这些规律并据此优化算法,可以避免不必要的排序操作。例如,在连续的对区间进行排序时,前一次排序的结果可能对下一次排序有所帮助。此外,可以判断相邻区间是否重叠来决定是否执行排序操作。对于某些特定条件,甚至可以不进行任何操作而直接更新结果字符串。例如对于提示中的测试点条件(Li = Li−1 或 Ri = Ri−1),可以利用这些规律来避免不必要的排序操作。

    代码实现建议

    基于上述分析,你可以尝试以下代码实现:

    • 使用字符数组来存储和操作字符串。
    • 优化排序逻辑,利用题目给出的规律来避免不必要的排序操作。可以考虑设计一个函数来判断是否需要对特定区间进行排序,而不是对所有区间都执行排序操作。这样可以在遇到不需要排序的情况时跳过排序步骤。同时尝试使用更高效的排序算法或者技巧来加速排序过程。可以尝试基于归并思想的算法来利用相邻区间的信息来减少重复工作。此外,也可以考虑使用位运算来加速处理过程。由于数据规模较大,位运算通常比普通的算术运算更快。对于连续的区间更新操作,可以尝试使用前缀和等技术来加速计算过程。对于非连续区间的更新操作,可能需要考虑更复杂的数据结构或算法来处理这种场景下的数据更新问题。尝试结合题目给出的规律和限制条件来设计算法逻辑以获得更好的性能表现同时避免不必要的复杂性以降低出错概率并加速代码开发过程尽量保证代码的简洁性和可读性以易于维护和调试包括合理地利用数据结构算法选择恰当的优化策略等等在这个过程中可以不断尝试改进算法逻辑以提高性能并在代码中进行充分的测试和验证以确保代码的正确性和稳定性从而解决问题并确保满足时间要求你可以结合以上建议进行修改并不断优化你的代码以达到最优性能同时也要保证代码的正确性和可维护性以满足实际需求如果你能遇到具体实现上的困难可以随时向我提问我会尽力帮助你解决问题
    评论

报告相同问题?

问题事件

  • 创建了问题 10月20日