zoukankan      html  css  js  c++  java
  • TOJ 2596: Music Notes

    2596: Music Notes 分享至QQ空间

    Time Limit(Common/Java):1000MS/10000MS     Memory Limit:65536KByte
    Total Submit: 3            Accepted:3

    Description

     

    FJ is going to teach his cows how to play a song. The song consists of N (1 ≤ N ≤ 100) notes, and the i-th note lasts for B_i (1 ≤ B_i ≤ 100) beats. The cows will begin playing the song at time 0; thus, they will play note 1 from time 0 to time B_1 - 1, note 2 fromtime B_1 to time B_1 + B_2 - 1, etc.

    The cows have lost interest in the song, as they feel that it is long and boring. Thus, to make sure his cows are paying attention, FJ asks them Q (1 ≤ Q ≤ 1,000) questions of the form, "During the beat at time T_i (0 ≤ T_i < length of song), which note should you be playing?" The cows need your help to answer these questions.

    By way of example, consider a song with these specifications: note 1 for length 2, note 2 for length 1, and note 3 for length 3:

    NOTES    1   1   2   3   3   3
           +---+---+---+---+---+---+
    TIME     0   1   2   3   4   5
    

    Input

     

    * Line 1: Two space-separated integers: N and Q
    * Lines 2..N+1: Line i+1 contains a single integer: B_i
    * Lines N+2..N+Q+1: Line N+i+1 contains a single integer: T_i

    Output

     

    * Lines 1..Q: Line i contains the a single integer that is the note the cows should be playing at time T_i

    Sample Input

     3 5 







    1

    Sample Output

     2 



     这么简单的题怎么没有人写题解,你有n首歌,问你可以听到第几首,前缀和处理下,然后二分直接输出啊

    #include<stdio.h>
    int a[105],n,q;
    int BS(int x)
    {
        int l=1,r=n;
        while(l<=r)
        {
            int mi=(l+r)/2;
            if(a[mi]>x)r=mi-1;
            else l=mi+1;
        }
        return l;
    }
    int main()
    {
        while(~scanf("%d%d",&n,&q))
        {
            scanf("%d",&a[1]);
            for(int i=2;i<=n;i++)
            {
                scanf("%d",&a[i]);
                a[i]+=a[i-1];
            }
            while(q--)
            {
                int x;scanf("%d",&x);
                printf("%d
    ",BS(x));
            }
        }
        return 0;
    }

     原题数据范围应该很大,这个暴力复杂度都还正常

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int a[105],n,q;
    int main()
    {
        while(~scanf("%d%d",&n,&q))
        {
            scanf("%d",&a[1]);
            for(int i=2;i<=n;i++)
            {
                scanf("%d",&a[i]);
                a[i]+=a[i-1];
            }
            while(q--)
            {
                int x;scanf("%d",&x);
                printf("%d
    ",(int)(upper_bound(a+1,a+n+1,x)-a));
            }
        }
        return 0;
    }

     

  • 相关阅读:
    剑指offer之第一个只出现一次的字符
    剑指offer之求1+2+...n
    剑指offer求两个整数之和(要求在函数体内不得使用+、-、*、/四则运算符号)
    剑指offer之从上往下打印二叉树
    剑指offer之栈的压入、弹出序列(利用辅助栈)
    58笔试-忘记题目
    联通软研院2020年球季校招笔试第三题 20190916
    简单的计算小技巧
    前端访问不到本地图片,IDEA设置Tomcat虚拟路径
    求最大子列和问题
  • 原文地址:https://www.cnblogs.com/BobHuang/p/7529934.html
Copyright © 2011-2022 走看看