zoukankan      html  css  js  c++  java
  • C语言 · LOG大侠

    标题:LOG大侠

    atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠。

    一天,Log大侠的好友 drd 有一些整数序列需要变换,Log大侠正好施展法力...

    变换的规则是: 对其某个子序列的每个整数变为: [log_2 (x) + 1] 其中 [] 表示向下取整,
    就是对每个数字求以2为底的对数,然后取下整。
    例如对序列 3 4 2 操作一次后,这个序列会变成 2 3 2。

    drd需要知道,每次这样操作后,序列的和是多少。

    【输入格式】
    第一行两个正整数 n m 。
    第二行 n 个数,表示整数序列,都是正数。
    接下来 m 行,每行两个数 L R 表示 atm 这次操作的是区间 [L, R],数列序号从1开始。

    【输出格式】
    输出 m 行,依次表示 atm 每做完一个操作后,整个序列的和。

    例如,输入:
    3 3
    5 6 4
    1 2
    2 3
    1 3

    程序应该输出:
    10
    8
    6


    【数据范围】
    对于 30% 的数据, n, m <= 10^3
    对于 100% 的数据, n, m <= 10^5

    注释:

    ceil():向上取整函数;

    floor():向下取整函数。

     1 #include<stdio.h>
     2 #include<math.h>
     3 int main(){
     4     int n,m;
     5     int sum=0;
     6     scanf("%d%d",&n,&m);
     7     int a[n];
     8     for(int i=0;i<n;i++){
     9         scanf("%d",&a[i]);
    10     }
    11     int l,r;
    12     for(int i=0;i<m;i++){
    13         scanf("%d%d",&l,&r);
    14         for(int j=l-1;j<=r-1;j++){
    15             //对元素a[j]求以2为底的对数,加1,再向下取整 
    16             a[j] = floor(log2(a[j])+1);
    17         }
    18         for(int k=0;k<n;k++){
    19             sum+=a[k];
    20         }
    21         printf("%d
    ",sum);
    22         sum=0;//序列和置0 
    23     }
    24     return 0 ;
    25 }
  • 相关阅读:
    uva11235 FrequentValues (ST表)
    hdu5449 Robot Dog (树形dp+倍增lca)
    [BZOJ1637][Usaco2007 Mar]Balanced Lineup
    [BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理
    Luogu1119灾后重建
    [APIO2012]派遣
    [HNOI2004]宠物收养场
    [USACO14DEC] 驮运Piggy Back
    [USACO14JAN]滑雪等级Ski Course Rating
    [CODEVS3366] 矿石
  • 原文地址:https://www.cnblogs.com/panweiwei/p/6661966.html
Copyright © 2011-2022 走看看