欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jzoj(senior)1273. 袁绍的刁难

程序员文章站 2024-03-17 13:34:16
...

题目提交网站

1273. 袁绍的刁难(recruitment.pas/cpp) 
(File IO): input:recruitment.in output:recruitment.out
Time Limits: 1000 ms  Memory Limits: 131072 KB
Description
  黄巾之乱后,郭嘉到了袁绍的统辖地区,结果袁绍想给我们的郭嘉大大一个下马威,且正值他招募将领的时候,于是乎,袁绍就让郭嘉大大去替他招募将领。
  这时候有很多很多的将领到袁绍处报到(别人家底厚,四世三公哪~~),每个将领的编号依次为1、2、3……N,第i个将领的武力值为3^(i-1)。
  袁绍需要我们的郭嘉大大招纳任意个将领,而郭嘉选中的将领有一个“总武力值”为各个将领的武力值之和。例如:郭嘉这一次招募了第一个将领和第三个将领,那么“总武力值”为1+9=10。
  袁绍想知道,他可以获得的第k大的“总武力值”是多少,请你帮助我们的郭嘉大大告诉袁绍这个第k大的“总武力值”。
  从文件中读入k,输出郭嘉能够获得的,第k大的“总武力值”。
Input
 数据包含n+1行,第一行读入n(n≤100)。以下n行每行包含一个k。
Output
 输出包含n行,每行输出一个对应的结果。
Sample Input
1
7
Sample Output
13
Data Constraint
Hint
样例说明:
郭嘉能够拿到的总武力值从小到大为1、3、4、9、10、12、13……所以第7大的总武力值是13。
对于50%的输入文件,有k≤5000。
对于100%的输入文件,有k≤2^31-1。

这道题其实将k转成二进制,然后每一位乘3^(i-1)就是答案了(对不起各位,我"吸"了氧原子(O1)、氧气(O2)和臭氧(O3)以及Ofast,和快读、快写,不过这也可以不用)

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
using namespace std;
long long int a[33],n,k,b[33],tou,xc,ans;
inline long long read()
{
    register long long int zzj=0,zyf=1;
    register char fqy=getchar();
    while(fqy<'0'||fqy>'9'){if(fqy=='-')zyf=-1;fqy=getchar();}
    while(fqy>='0'&&fqy<='9'){zzj=zzj*10+fqy-'0';fqy=getchar();}
    return zzj*zyf;
}
inline void write(register long long int fqy)
{
    if(fqy<0)putchar('-');
    if(fqy>9)write(fqy/10);
    putchar(fqy%10+'0');
}
int main()
{
//  freopen("recruitment.in","r",stdin);
//  freopen("recruitment.out","w",stdout);
    a[0]=1;
    for(long long int i=1;i<=32;i++)
    {
        a[i]=a[i-1]*2;a[i-1]--;
    }
    b[1]=1;
    for(long long int i=2;i<=32;i++)
    {
        b[i]=b[i-1]*3;
    }
    n=read();
    for(long long int w=1;w<=n;w++)
    {
        k=read();
        tou=32;xc=k;ans=0;
        while(xc>0)
        {
            for(long long int i=1;i<=tou;i++)
            {
                if(a[i-1]<xc&&xc<=a[i])
                {
                    tou=i;break;
                }
            }
            ans+=b[tou];
            xc-=a[tou-1]+1;
        }
        write(ans);
        printf("\n");
    }
    return 0;
}