XidianOJ 1108 Too Young

题目描述

对于某一正整数,可以执行两种操作之一:
1、将它除以2(奇数除外, 其实就是进行操作1之前必须满足是偶数);
2、将它减去1.
直到它变成1。
例如将12变成1的过程如下:12->6->3->2->1.
现在你需要求出从a到b的所有整数中(包括a,b),将它们都变成1至少需要多少次操作。

输入

多组测试数据(大约10000组),处理到EOF。
每组数据包含一行,分别表示a,b。 1  <= a ,b <= 1000000

输出

对于每组数据输出一行,表示最少的操作数。

--正文

先预处理算出所有数的次数

然后使用树状数组处理操作

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define SIZE 1000000
int b[SIZE + 1],c[SIZE + 1];
int lowbit(int i) {
    return i&-i;
}
void Update(int i,int x){
    while (i <= SIZE){
        c[i] += x;
        i+= lowbit(i);
    }
}
int Sum(int i){
    int sum = 0;
    while(i > 0){
        sum += c[i];
        i-=lowbit(i);
    }
    return sum;
}

int main(){
    int i,l,r;
    b[1] = 0; b[2] = 1;
    Update(2,1);
    for (i=3;i<=1000000;i++){
        if (i % 2 == 0){
            b[i] = b[i/2] + 1;
        }
        else
            b[i] = b[i-1] + 1;
        Update(i,b[i]);
    }
    while (scanf("%d %d",&l,&r) != EOF){
        int s1 = Sum(r);
        int s2 = Sum(l);
        printf("%d\n",s1-s2+b[l]);
    }
    return 0;
} 
时间: 2024-10-10 15:38:28

XidianOJ 1108 Too Young的相关文章

Young Maids

E - Young Maids Time limit : 2sec / Memory limit : 256MB Score : 800 points Problem Statement Let N be a positive even number. We have a permutation of (1,2,…,N), p=(p1,p2,…,pN). Snuke is constructing another permutation of (1,2,…,N), q, following th

[2016-03-22][CF][69A][Young Physicist]

时间:2016-03-22 19:41:34 星期二 题目编号:[2016-03-22][CF][69A][Young Physicist] 题目大意:判断向量和是否为0 分析:对应坐标相加 遇到的问题:不能用x+y+z来判断是否都为0,除非输入都是正数 #include <cstdio> using namespace std; int main(){ int a,b,c,x,y,z,n; x = y = z = 0; scanf("%d",&n); for(in

线性DP POJ2279 Mr.Young&#39;s Picture Permutations

Mr. Young's Picture Permutations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1128   Accepted: 562 Description Mr. Young wishes to take a picture of his class. The students will stand in rows with each row no longer than the row behin

算法导论 6-3 Young氏矩阵

一.题目 二.思考 最小Young氏矩阵和最小堆的思想差不多,可以通过比较两者的同异来理解Young氏矩阵 不同点:   min-Heap min-Young 堆顶(最小值) H[1] Y[i][j] 最后一个元素的位置 H[N] Y[N][N] 最后一个元素 不一定是最大值 一定是最大值 parent H[i]的parent是H[i/2] Y[i][j]的parent是Y[i-1][j]和Y[i][j-1] child H[i]的child是H[i*2]和H[i*2+1] Y[i][j]的ch

UVA 1108 - Mining Your Own Business(双连通分量)

UVA 1108 - Mining Your Own Business 题目链接 题意:给定一个连通图,设置一个些安全点,使得其他任意一些节点崩塌后,其他点都能到一个安全点,问安全点最小数量和情况数 思路: #include <cstdio> #include <cstring> #include <vector> #include <stack> #include <map> using namespace std; const int N =

1108: 零起点学算法15——交换变量

1108: 零起点学算法15--交换变量 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 3266  Accepted: 1706[Submit][Status][Web Board] Description 水题 Input 输入2个整数(题目包含多组测试数据) Output 输出交换后的2个整数(每组测试数据一行,中间用空格隔开) Sample Input 825 23 Sample Outpu

题目1108:堆栈的使用

时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8423 解决:2472 题目描述: 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.Push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出.现在我们就来验证一下堆栈的使用. 输入: 对于每组测试数据,第一行是一个正整数 n,0<n<=10000(n=0 结束).而后的 n 行,每行的第一个字符可能是'P’或者'O’或者'A’:如果是'P’,后面还会跟着一个整数,表示把这个数据压入堆栈:如果是'O’,表示

Young Table(暴力,交换位置)

Young Table Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 237B Appoint description:  System Crawler  (2016-04-26) Description You've got table a, consisting of n rows, numbered from 1

长春网络赛 1108

Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1108    Accepted Submission(s): 587 Problem Description Elves are very peculiar creatures. As we all know, they can live for a ver