关闭

2015 ACM/ICPC合肥网赛&HDU5491 The Next

1129人阅读 评论(0) 收藏 举报
分类:

传送门

题意:给出一个数字n,其二进制表示中1的个数在a~b之间,求出个数在a~b之间的比n大的最小的数。

 思路:首先用一个数组存储n的二进制数,从低到高枚举0出现的位置,若把该位置为1,该位之前的全部置0后,若所有1的个数仍然比b大,则向后枚举下一个为0的位置,直到最高位。

 若1的总数大于a小于b,则直接把该位置为1,之前为0,这个数就是最小的数。

 若总数小于a,则从最低位开始往上设置1,由此保证这个数是满足要求的最小的数。

(语文实在不好,没看懂的结合代码看吧)

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 55;
int T,a,b,num[maxn],sum[maxn],cases = 0;
long long n,t;
int main(){
    scanf("%d",&T);
    while(T--){
        memset(num,0,sizeof(num));
        memset(sum,0,sizeof(sum));
        scanf("%lld%d%d",&n,&a,&b);
        t=n;
        int all = 0,pos = 0;
        while(t){
            if(t&1) all++,num[pos]=1;
            t>>=1;pos++;
        }
        sum[pos-1]=num[pos-1];
        for(int i=pos-2;i>=0;i--)
            sum[i]+=sum[i+1]+num[i];
//        for(int i=pos-1;i>=0;i--)
//            cout<<num[i]<<endl;
        for(int i=0;i<=pos;i++){
            if(!num[i]){
                int tempall = sum[i]+1;
//                cout<<tempall<<" "<<b<<endl;
//                cout<<"--------------"<<endl;
                if(tempall>b) continue;
                long long ans = 0;
                int post = 0;
                while(tempall<a){
                    ans += pow(2,post);
                    post++;
                    tempall++;
                }
//                cout<<ans<<endl;
                ans+=pow(2,i);
//                cout<<ans<<endl;
                for(int j=i+1;j<pos;j++)
                    ans += num[j]*pow(2,j);
                printf("Case #%d: %lld\n",++cases,ans);
                break;
            }
        }
    }
    return 0;
}


0
0
查看评论

hdu5491 The Next(合肥网赛)

The Next Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21 Accepted Submission(s): 10 Pr...
  • d_x_d
  • d_x_d
  • 2015-09-27 18:08
  • 1222

2016 acm/icpc 沈阳现场赛题解(5道题,更新ing)

5948.Thickest Burger(签到题)http://acm.hdu.edu.cn/showproblem.php?pid=5948题目大意:给你A和B,问2A+B和2B+A谁大?题目分析:略。#include <bits/stdc++.h> using namespace s...
  • cmershen
  • cmershen
  • 2016-11-21 21:59
  • 2098

2017ACM/ICPC广西邀请赛-重现赛

这是在厚林工作室4个人打的一场骚呢两年没回去了拿lzy的号打,打的被老刘查水表了01枚举kkk^k,k≤15k \leq 15。 看到我的TT就知道我是怎么wa的了。。#include <bits/stdc++.h>using namespace std; typedef long l...
  • cww97
  • cww97
  • 2017-08-31 21:16
  • 1104

2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛J

Life is a journey, and the road we travel has twists and turns, which sometimes lead us to unexpected places and unexpected people. Now our journ...
  • Little_boy_z
  • Little_boy_z
  • 2017-09-11 20:20
  • 488

第一次参加区域赛之旅——2016 ACM/ICPC 大连站 感想

一 . 行程     说到行程简直是一把鼻涕一把泪。学校不报销卧铺,只能坐硬座,而且没有直达车,所以还要在北京转车。30多个小时啊~~。回来就更别说了,转五趟车。差点没挂在火车上。。。 二 . 旅游    ...
  • y1196645376
  • y1196645376
  • 2016-10-19 11:13
  • 2922

2017ACM/ICPC沈阳站总结

比完赛,写一个总结: 因为一个队友是本地人的缘故,我们两个人住就能够花钱花得大方点了,没有住汉庭(汉庭的隔音真的差),我个人对房间还是非常满意的。第一天热身赛,我们10分钟切掉了AD两题,然后B死活过不去。。。上机的我怀疑人生了,四联通八联通都不会写了嘛orz。。后来把空行去掉了就过了orz。。果...
  • hahatianx
  • hahatianx
  • 2017-10-23 11:02
  • 900

【解题报告】2015ACM/ICPC亚洲区沈阳站

简略的解题报告。
  • TRiddle
  • TRiddle
  • 2016-02-19 16:20
  • 1343

2015 ACM/ICPC 长春现场赛

<题目链接>hdu
  • w20810
  • w20810
  • 2015-11-01 21:36
  • 901

hdu5491(2015合肥网络赛H题)

题意: 给出三个数字D、s1和s2,用L来表示D的二进制表示中1的个数,L在区间[s1,s2]中,我们要找到离D最近的并且大于D的一个数字,且这个数字的L也落在区间[s1,s2]中。 思路: 一直超时。。。不知道为啥,后来也不知道为啥就不超时了。。。说说不超时的代码。 对于一个数字D...
  • ms961516792
  • ms961516792
  • 2015-09-28 19:17
  • 256

2017 ACM-ICPC亚洲区域赛 西安站总结

这次是第二次去西安参加比赛了,上一次也是在同样的学校,不一样的是这次比赛是在体育馆里打的,有点兴奋。因为上次有了经验,所以这次订的酒店还有去学校的交通都熟悉了,总的来说去的路程是比上次要舒服很多。   10/27下午3点多从学校里出发,到达西安后已经是晚上十一点多了,还好去之前查了一下当地的天气,...
  • hovees
  • hovees
  • 2017-11-02 00:45
  • 172
    个人资料
    • 访问:26716次
    • 积分:849
    • 等级:
    • 排名:千里之外
    • 原创:63篇
    • 转载:3篇
    • 译文:0篇
    • 评论:14条
    文章分类
    最新评论