zoukankan      html  css  js  c++  java
  • BNU27937——Soft Kitty——————【扩展前缀和】

    Soft Kitty

    Time Limit: 1000ms
    Memory Limit: 65536KB
    64-bit integer IO format: %lld      Java class name: Main
    Type: 
    None
     
     

    laimao很喜欢这首“BigBang”里的“Soft Kitty”,这首歌的歌词很简单只有6句,"soft kitty, warm kitty, little ball of fur,happy kitty, sleepy kitty, purr purr purr.",她总是唱着玩儿。现在她无聊了决定换一个玩法,你来说出一个数字n,她来唱出第n(1 ≤ n ≤ 10^9)句歌词。注意了她的唱法是,第i次唱这首歌时,每句歌词重复2^(i-1)次。就是像这样,“soft kitty, warm kitty, little ball of fur, happy kitty, sleepy kitty, purr purr purr, soft kitty, soft kitty, warm kitty, warm kitty, little ball of fur, little ball of fur,……”你能帮助她输出第n句歌词么(不包括标点)?

     

    Input

    多组数据,第一行是一个整数K(0<K<=100),表示数据组数。接下来K行,每行一个数字n,表示你需要输出第n句歌词。

     

    Output

    输出对应歌词

     

    Sample Input

    8
    1
    2
    3
    4
    5
    6
    7
    8
    

    Sample Output

    soft kitty
    warm kitty
    little ball of fur
    happy kitty
    sleepy kitty
    purr purr purr
    soft kitty
    soft kitty


    错误点分析:前缀和计算时出错,数据范围没有考虑好,要用longlong用了int


    解题思路:用前缀和的下标来映射唱n首歌。


    #include<stdio.h>
    #include<string.h>
    #include<string>
    #include<iostream>
    #include<math.h>
    #include<algorithm>
    using namespace std;
    long long f[50];
    long long suf[50];
    string ss[10];
    void work(){
    
        ss[0]="soft kitty";
        ss[1]="warm kitty";
        ss[2]="little ball of fur";
        ss[3]="happy kitty";
        ss[4]="sleepy kitty";
        ss[5]="purr purr purr";
        f[0]=0;
        suf[0]=0;
        f[1]=6;
        suf[1]=6;
        for(int i=2;i<50;i++){
    
           f[i]=f[i-1]*2;
           suf[i]=suf[i-1]+f[i];
        }
    }
    void solve(long long m){
    
        int i;
        for(i=1;i<50;i++){
    
            if(suf[i]>=m){
    
              break;
            }
        }
        m-=suf[i-1];
        long long ti=(long long)pow(2,i-1);
        if(m%ti==0){
    
            cout<<ss[m/ti-1]<<endl;
        }else{
    
            cout<<ss[m/ti]<<endl;
        }
    }
    int main(){
    
        int K;
        work();
        scanf("%d",&K);
        while(K--){
    
            long long  n;
            scanf("%lld",&n);
            solve(n);
        }
        return 0;
    }
    

      

     
  • 相关阅读:
    源代码搭建应用(一)——动手搭建自己的计算集群系统
    [转载]Ubuntu 14.04中root 密码忘记解决方法
    如何用路由器改成WiFi Pineapple系统镜像网络流量
    DELPHI黑客编程(一):正向后门原理实现
    OpenWrt 路由器过滤广告的N种方法
    Windows 10 上强制Visual Studio以管理员身份运行
    DB2修改表字段
    Git Fast-forward提交
    C#(去、过滤)掉字符中的换行符
    VS读取文件或写入文件时出现中文乱码问题
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4354130.html
Copyright © 2011-2022 走看看