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 }
  • 相关阅读:
    将"089,0760,009"变为 89,760,9
    单向循环链表
    双链表复习
    【C语言】scanf()输入浮点型数据
    【C语言】一元二次方程(求实根和虚根)
    输入一个三位正整数,输出百位数,十位数,个位数
    输入身份证号,输出出生日期
    比较四个数的大小
    比较三个数的大小
    比较两个数的大小
  • 原文地址:https://www.cnblogs.com/panweiwei/p/6661966.html
Copyright © 2011-2022 走看看