首页 > 代码库 > Codeforces Round #276 (Div. 1)
Codeforces Round #276 (Div. 1)
给俩数, 求他俩之间二进制数中1最多的,有多个输出最小的;
贪心,从小到大加能加就加,最后可能碰到一个不能加了但是当前数比l小,那么就加上这个数,然后从大到小,能减就减,见到符合条件
#include<iostream>#include<stdio.h>#include<string.h>using namespace std;int main(){ long long n, l, r; long long a[100]; long long s = 1, maxa = 1e18; long long u; for(long long i = 0;; i++){ a[i] = s; s*=2; u = i; if(s > maxa)break; } //for(int i = 0; i <= u; i++)printf("%lld ", a[i]); cin>>n; while(n--){ cin>>l>>r;//printf("*%d", u); long long sum = 0; for(int i = 0; i <= u; i++){ if(sum + a[i] <= r){//cout<<sum<<" "<<a[i]<<endl; sum += a[i]; }else if(sum < l){ sum += a[i]; for(int k = i-1; k >= 0; k--){ if(sum - a[k] >= l){ sum -= a[k]; } if(l <= sum && sum <= r) break; }break; } } cout<<sum<<endl; }}
Codeforces Round #276 (Div. 1)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。