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 
#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

你可能感兴趣的:(思维)