• 音乐节拍【模拟】


    题目大意:

    这里写图片描述


    思路:
    几万的范围,O(n2)肯定过不了,但O(nlogn)可以过。

    我们可以使用离线做法,将问题排序,再用指针j指向每一个问题,由于这时问题满足单调递增,所以总共就只要O(n),平均每次循环O(1),再加上枚举的大循环,求出答案就只要O(n)所以这样做总时间复杂度为O(nlogn)

    当然这道题还可以用二分,时间复杂度O(qlogn)


    代码:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int n,m,a[80001],j;
    
    struct N
    {
        int num,q,ans;
    }b[80001];
    
    bool cmp(N x,N y)
    {
        return x.q<y.q;
    }
    
    bool cmp2(N x,N y)
    {
        return x.num<y.num;
    }
    
    int main()
    {
        freopen("mnotes.in","r",stdin);
        freopen("mnotes.out","w",stdout);
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            a[i]+=a[i-1];  //前缀和
        }
        for (int i=1;i<=m;i++)
        {
            scanf("%d",&b[i].q);
            b[i].num=i;
        } 
        sort(b+1,b+m+1,cmp);  //排序
        j=1;  //指针
        for (int i=1;i<=n;i++)
        {
            while (b[j].q<a[i])  //单调性
            {
                b[j].ans=i;
                j++;
                if (j>m) break;
            }   
            if (j>m) break;
        }
        sort(b+1,b+m+1,cmp2);  //排回去
        for (int i=1;i<=m;i++)
         printf("%d\n",b[i].ans);
        return 0;
    }
  • 相关阅读:
    二级菜单
    侧面导航
    QFileDialog文件保存
    GitHub for window
    Qt学习事件/信号
    开始RTThread之旅
    Qt事件过滤器
    LPC1768开发板液晶问题解决
    用QSplitter分裂器实现QTextEdit窗口大小的变化
    Qt之串口编程使用事件驱动来触发接收数据
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313046.html
Copyright © 2020-2023  润新知