CodeForces1388B - Captain Flint and a Long Voyage

题意

将一个 n n n位十进制的数,转换成2进制,然后删除2进制的最后 n n n位,问剩下的二进制最大的时候,十进制数最小为多少。

题解

写一下0~9的2进制代码,发现只有8,9是4位。同样进制下比较数的大小,最先比的就是位数,那么2进制数的数位应该尽量多,这样删去后n位剩下的位数也是最多的。那么这个十进制数肯定每一位上只有9,8,可以确定剩下2进制数的位数。9是 ( 1001 ) 2 (1001)_2 (1001)2,8是 ( 1000 ) 2 (1000)_2 (1000)2,同等位数下比较肯定9是更优的。因此我们删去 n n n位后剩下来的,尽量是 ( 1001 ) 2 (1001)_2 (1001)2;十进制数又要最小,那么删去的最好是 ( 1000 ) 2 (1000)_2 (1000)2。所以,十进制后面为8的应该是 ⌊ n 4 ⌋ \lfloor \frac{n}{4} \rfloor 4n还是 ⌈ n 4 ⌉ \lceil \frac{n}{4} \rceil 4n。但是由于8是 ( 1000 ) 2 (1000)_2 (1000)2,如果 n m o d      4 ≠ 0 n \mod\ 4\neq0 nmod 4=0,那么至少为1,也就是说这一位即使放9,也会被冲掉,而8和9二进制中间两位都是0,效果是是一样的,所以应该是 ⌈ n 4 ⌉ \lceil \frac{n}{4} \rceil 4n

AC代码

#include <bits/stdc++.h>
#define pb push_back 
#define fir first
#define sec second
#define ms(a,b) memset(a,b,sizeof(a)) 
#define INF 0x3f3f3f3f
#define sp system("pause")
#define multi int t;cin>>t;while(t--) 
using namespace std;
typedef long long ll;
typedef double db;
const int N=1e4+5;
const int mod=10007;
const db pi=acos(-1.0);
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("D:\\work\\data.in","r",stdin);
    #endif
    multi{
        int n;
        cin>>n;
        int t=ceil(n/4.0);
        for(int i=0;i<n-t;i++) cout<<9;
        for(int i=0;i<t;i++) cout<<8;
        cout<<endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值