首页 > 其他分享 >CSP历年复赛题-P1010 [NOIP1998 普及组] 幂次方

CSP历年复赛题-P1010 [NOIP1998 普及组] 幂次方

时间:2024-05-20 09:30:35浏览次数:16  
标签:递归 pow2 P1010 int 拆解 137 NOIP1998 次方 CSP

原题链接:https://www.luogu.com.cn/problem/P1010

题意解读:输出一个正整数的2 的幂次方表示,需要用到二进制数学知识,将整数拆解成2的次幂之和,幂次方也要进行拆解,因此容易想到通过递归处理。

解题思路:

先看样例,给定整数137,要拆解成2的幂次方之和,

先考虑i使得刚好137>=2^i时,i取7,因此2^7是一个因子,137-2^7 = 137 - 128 = 9

再考虑i使得刚好9>=2^i时,i取3,因此2^3是一个因子,9 - 2^3 = 9 - 8 = 1

最后考虑i使得刚好1>=2^i时,i取0,因此2^0是一个因子,1 - 2^0 = 1 - 1 = 0

这样就完成了拆解137 = 2^7 + 2^3 + 2^0

因为整数最大是20000,因此每次在遍历找到第一个i时,可以从i=15开始递减,因为2^15 = 32768 > 20000 > 2^14 = 16384

要按格式输出结果,就需要递归处理

具体递归过程请参考代码注释。

100分代码:

#include <bits/stdc++.h>
using namespace std;

int n;
int pow2[20]; //预计算2^i,pow2[i]表示2^i

//预计算pow2[20]
void init()
{
    int num = 1;
    pow2[0] = num;
    for(int i = 1; i <= 20; i++)
    {
        num *= 2;
        pow2[i] = num;
    }
}

//递归处理
void decode(int x)
{
    if(x == 0) //是0的时候就不需要拆解成2的次方了,直接输出
    {
        cout << "0";
        return;
    }

    for(int i = 15; i >=0; i--) //由于最大值是20000,要将x拆解多个2的次方之和,从2^15开始看是否够减,依次往后看
    {
        if(x >= pow2[i])
        {
            cout << "2";
            if(i != 1) //如果2^1,则直接输出2即可,不需要(1)
            {
                cout << "(";
                decode(i);
                cout << ")"; 
            }  

            x -= pow2[i];
            break; //只需要找第一个满足要求的i,剩下的交给递归处理
        } 
    }

    if(x > 0) //如果x减去2^i之后不为0,继续递归处理剩下的部分
    {
        cout << "+"; //+加上剩下的部分
        decode(x);
    }
}

int main()
{
    init(); //先预计算出2^i,存入pow2[20],便于后面使用
    cin >> n;
    decode(n);
    return 0;
}

 

标签:递归,pow2,P1010,int,拆解,137,NOIP1998,次方,CSP
From: https://www.cnblogs.com/jcwy/p/18201229

相关文章

  • CSP历年复赛题-P1548 [NOIP1997 普及组] 棋盘问题
    原题链接:https://www.luogu.com.cn/problem/P2241题意解读:要在整个n*m区域计算正方形和长方形的个数,枚举法即可。解题思路:此题枚举的对象是矩形的高i和宽j,高的范围[1,n],宽的范围[1,m],然后计算在n*m区域内有多少个i*j,i==j即属于正方形,i!=j属于长方形。那么,问题就集中在了......
  • csp2023 游记
    2023.10.20(Day0)S1拿了\(68.5\)分,顺利晋级。但是J1只拿了\(60.5\),没了。S2就在自己的学校(而且甚至是我上信息技术课的教室),所以试机了和没试机没有任何区别qwq。在luogu上面打了一下a+b,回顾了一下编译就走了。2023.10.21(Day1)正序开题,发现T1好像是\(5\)个fo......
  • 梦熊四月 csp-s 模拟赛2 T2 排序
    小B想要对一个长为\(n\)的序列\(A\)排序。已知\(A\)中只包含\(0,1,\cdots,n-1\)且对任意\(i\nej\)有\(A_i\neA_j\)且\(n\)为\(2\)的次幂。为了排序,小B只想用以下两种操作:交换相邻的两个位置,也就是说选择\(1\lei\len-1\)并且交换\(A_i,A_{i+1}\)。......
  • 洛谷 P1012 [NOIP1998 提高组] 拼数 题解
    题目简述设有$n$个正整数$a_1\dotsa_n$,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。题目分析定义设$X$为数字$x$的字符串形式。$A+B$表示字符串$A$和字符串$B$相连组成的字符串。思路既然要构造最优解,显然如果有不优的情况的话,就需要对序列进行......
  • P5664 [CSP-S2019] Emiya 家今天的饭
    题意简述有\(n\)种方法和\(m\)种食材,第\(i\)种方法第\(j\)种食材做出来的菜有\(a_{i,j}\)种。有以下限制:至少做一盘菜。每种方法做出来的菜品数至多为\(1\)。所有以第\(i\)种食材做出来的菜品数不超过菜品种数的一半。求方案数。\(n\le100,m\le2\times10^......
  • P1010 [NOIP1998 普及组] 幂次方
    题目:P1010[NOIP1998普及组]幂次方[NOIP1998普及组]幂次方题目描述任何一个正整数都可以用2的幂次方表示。例如137=27+23+2^0。同时约定次方用括号来表示,即a^b可表示为a(b)。由此可知,137可表示为2(7)+2(3)+2(0)进一步:$7=22+2+20(2^1用2表示),并且3=2+2^......
  • P9753 [CSP-S 2023] 消消乐
    P9753[CSP-S2023]消消乐这题想到了50pts,想不出来怎么优化了。50pts:考虑枚举子串左端点,模拟操作过程,直接用栈模拟,遇到相同的则删去,如果某个时刻栈为空,那么合法子串数加一。考场上只想到为空的时候可消除,下面的性质才是关键的。因为我们枚举左端点,每次只判断了\([l,r]\)的......
  • P7914 [CSP-S 2021] 括号序列
    P7914[CSP-S2021]括号序列看起来非常复杂的括号题,看到数据范围,大概确定是区间dp,所以我们考虑怎么定义状态。条件非常多,所以二维的状态肯定表示不了,考虑多加一维来定义不同的状态。\(dp_{i,j,0}\):区间形式是***...***的方案数。\(dp_{i,j,1}\):区间形式是(...)的方案数......
  • [CSP-J2019] 数字游戏
    [CSP-J2019]数字游戏题目描述小K同学向小P同学发送了一个长度为8的01字符串来玩数字游戏,小P同学想要知道字符串中究竟有多少个1。注意:01字符串为每一个字符是0或者1的字符串,如101为一个长度为3的01字符串。输入格式输入文件只有一行,一个长度为8的0......
  • 洛谷 P8818 [CSP-S 2022] 策略游戏
    https://www.luogu.com.cn/problem/P8818什么玩意儿。。这种策略题不就是你来我往的,你如果选那个我就选这个,到了最后俩人都做不了决策,一直在博弈吗放个示例跑不过去的代码真不想调,这种题就是恶心啊,你说说怎么调呢针对一方的选择,另一方总能选出更优的策略来。然后这一方针对另......