zoukankan      html  css  js  c++  java
  • 【贪心】【模拟】HDU 5491 The Next (2015 ACM/ICPC Asia Regional Hefei Online)

    题目链接:

      http://acm.hdu.edu.cn/showproblem.php?pid=5491

    题目大意:

      一个数D(0<=D<231),求比D大的第一个满足:二进制下1个个数在[s1,s2]范围内。D已经满足[s1,s2]。

    题目思路:

      【贪心】【模拟】

      首先将这个数转成二进制统计总共1的个数s,再求出末尾连续0和1的个数n0,n1。

      如果最后一位是0:

        s=s2,那么为了保证s<s2且答案>D,先设ans=d+lowbit(d),此时满足了新的s<s2且答案>D,但这时有可能s<s1,需要从最低位开始补1。

        s<s2,那么ans=n+1为答案。

      如果最后一位是1:先ans=n+1在看新的s(s只减不增)

        s<s1,那么从最低位开始补1。

        否则,ans即为答案

      1 //
      2 //by coolxxx
      3 //#include<bits/stdc++.h>
      4 #include<iostream>
      5 #include<algorithm>
      6 #include<string>
      7 #include<iomanip>
      8 #include<map>
      9 #include<stack>
     10 #include<queue>
     11 #include<set>
     12 #include<bitset>
     13 #include<memory.h>
     14 #include<time.h>
     15 #include<stdio.h>
     16 #include<stdlib.h>
     17 #include<string.h>
     18 //#include<stdbool.h>
     19 #include<math.h>
     20 #define min(a,b) ((a)<(b)?(a):(b))
     21 #define max(a,b) ((a)>(b)?(a):(b))
     22 #define abs(a) ((a)>0?(a):(-(a)))
     23 #define lowbit(a) (a&(-a))
     24 #define sqr(a) ((a)*(a))
     25 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
     26 #define mem(a,b) memset(a,b,sizeof(a))
     27 #define eps (1e-8)
     28 #define J 10000
     29 #define mod 1000000007
     30 #define MAX 0x7f7f7f7f
     31 #define PI 3.14159265358979323
     32 #define N 44
     33 using namespace std;
     34 typedef long long LL;
     35 int cas,cass;
     36 int n,m,lll,ans;
     37 LL aans;
     38 LL e[N];
     39 int a[N];
     40 int s,s1,s2,n0,n1;
     41 void init()
     42 {
     43     int i;
     44     e[0]=1;
     45     for(i=1;i<32;i++)e[i]=e[i-1]<<1;
     46 }
     47 int main()
     48 {
     49     #ifndef ONLINE_JUDGE
     50 //    freopen("1.txt","r",stdin);
     51 //    freopen("2.txt","w",stdout);
     52     #endif
     53     int i,j,k;
     54     init();
     55 //    for(scanf("%d",&cass);cass;cass--)
     56     for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
     57 //    while(~scanf("%s",s+1))
     58 //    while(~scanf("%d",&n))
     59     {
     60         scanf("%d%d%d",&n,&s1,&s2);
     61         s=n1=n0=0;mem(a,0);
     62         m=n;
     63         if(n==0)a[0]=1;
     64         while(m)
     65         {
     66             a[++a[0]]=m&1;
     67             s+=m&1;
     68             m>>=1;
     69         }
     70         if(a[1]==0)
     71         {
     72             for(i=1;i<=a[0] && a[i]==0;i++)n0++;
     73             for(;i<=a[0] && a[i]==1;i++)n1++;
     74             if(n0)
     75             {
     76                 if(s==s2)
     77                 {
     78                     aans=1LL*n+lowbit(n);
     79                     s=s+1-n1;n0+=n1;
     80                     if(s<s1)
     81                     {
     82                         for(i=0;i<s1-s;i++)
     83                             aans+=e[i];
     84                     }
     85                 }
     86                 else
     87                 {
     88                     aans=1LL+n;
     89                 }
     90             }
     91         }
     92         else
     93         {
     94             for(i=1;i<=a[0] && a[i]==1;i++)n1++;
     95             for(;i<=a[0] && a[i]==0;i++)n0++;
     96             s=s+1-n1;
     97             aans=1LL+n;
     98             if(s<s1)
     99             {
    100                 for(i=0;i<s1-s;i++)
    101                     aans+=e[i];
    102             }
    103         }
    104         printf("Case #%d: %lld
    ",cass,aans);
    105     }
    106     return 0;
    107 }
    108 /*
    109 //
    110 
    111 //
    112 */
    View Code
  • 相关阅读:
    SQLServer 获取汉字拼音的首字母(大写)函数
    MySQL动态SQL的拼接以及执行、分页
    Jdbc连接sqlserver,mysql,oracle
    MySQL之排序显示行号
    List的分组,求和,过滤操作
    linux 常用命令集合
    redis 基本类型和命令(一)
    ORCLE 创建表空间,用户,赋予角色以及授权
    游标
    【应用服务 App Service】App Service中上传文件/图片(> 2M)后就出现500错误(Maximum request length exceeded).
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/5830620.html
Copyright © 2011-2022 走看看