HDU 5491 The Next (2015年合肥赛区网络赛H题)
2015-09-28 10:39
399 查看
1.题目描述:点击打开链接
2.解题思路:本题要求找一个尽量小的数字,使得它大于D,且二进制表示中1的个数在区间[s1,s2]中。比赛时候想了好久,终于想到一个比较诡异的做法:如首先把D分解成二进制并把每一位都放到数组base中,并用num来统计当前1的个数。如果最低位是0,那么先把它变成1,并检查此时1的个数是否符合要求。接下来,开始不停地寻找形如”11..1110“的序列,并把这段全部取反,变成”00...0001“,更新num,并检查是否符合题意。如果不符合,那么把0由小到大逐个置位,并检查num是否符合题意。如果都不符合,那么继续重复上述过程,直到符合题意为止。不过需要注意转换成答案时候要变成long
long型。
3.代码:
2.解题思路:本题要求找一个尽量小的数字,使得它大于D,且二进制表示中1的个数在区间[s1,s2]中。比赛时候想了好久,终于想到一个比较诡异的做法:如首先把D分解成二进制并把每一位都放到数组base中,并用num来统计当前1的个数。如果最低位是0,那么先把它变成1,并检查此时1的个数是否符合要求。接下来,开始不停地寻找形如”11..1110“的序列,并把这段全部取反,变成”00...0001“,更新num,并检查是否符合题意。如果不符合,那么把0由小到大逐个置位,并检查num是否符合题意。如果都不符合,那么继续重复上述过程,直到符合题意为止。不过需要注意转换成答案时候要变成long
long型。
3.代码:
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<cassert> #include<string> #include<sstream> #include<set> #include<bitset> #include<vector> #include<stack> #include<map> #include<queue> #include<deque> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<cctype> #include<complex> #include<functional> #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; #define me(s) memset(s,0,sizeof(s)) #define rep(i,n) for(int i=0;i<(n);i++) typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull; typedef pair <ll,ll> P; int D, s1, s2; const int N = 100 + 10; int base ; int cnt; void change(int x) { cnt = 0; while (x>0) { base[cnt++] = x % 2; x >>= 1; } } void print() { for (int i = 0; i<cnt; i++) printf("%d", base[i]); puts(""); } int bitcount(ll a) { if (!a)return 0; return bitcount(a / 2) + (a & 1); } bool check(int x) { if (s1 <= x&&x <= s2)return false; return true; } void test() { for (int i = 0; i < 33; i++) base[i] = 1; ll ans = 0; for (int i = 0; i < 33; i++) ans += ((ll)base[i] << i); cout << ans << endl; } int main() { int T; int rnd = 0; //test(); scanf("%d", &T); while (T--) { me(base); scanf("%d%d%d", &D, &s1, &s2); change(D); //print(); int num = bitcount(D); int up = max(s2, cnt); int st = 0, ed = 0; if (base[0] == 0) { base[0] = 1; num++; if (!check(num))goto x1; } do { for (int i= 0; i < up + 10;i++) if (base[i]) { st = i; break; }//找形如“11...1110”的序列 for (int i = st; i < up + 10;i++) if (!base[i]) { ed = i; break; } for (int i = st; i <= ed; i++) { base[i] = !base[i]; } num -= (ed - st - 1); if (!check(num))break; for (int i = st; i < ed; i++) { base[i] = !base[i]; num++; if (!check(num))break; } } while (check(num)); x1:; ll ans = 0; for (int i = 0; i<up+10; i++) ans += ((ll)base[i]<<i); printf("Case #%d: %lld\n", ++rnd, ans); } }
相关文章推荐
- Swift - 判端网络连接状态,连接类型(3G还是Wifi)
- erlang HTTP 客户端 使用实例
- 9月第3周网络安全报告:被篡改的.COM网站占75.8%
- VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT
- KJHttp框架使用讲解
- ubuntu 使用ifupdown 进行高级网络设置
- 新手对Bash环境变量解析漏洞的理解 http://www.linuxidc.com/Linux/2014-10/107984.htm
- Qemu Network Device全虚拟:前端网络流的建立(基于QEMU2.0.0)
- KJBitmap与KJHttp的深度用法
- Swift - 做一个简单的无线U盘(手机端Http服务器搭建)
- 接口测试 - httpClient
- SDWebImage 第三方框架的使用——网络图片的处理操作
- WMware虚拟机中无法连接到网络可能的原因
- 禁用网络适配器时出现“此时无法停用,这个链接可能在用一个或多个不支持即插即用的协议”
- Android实战简易教程<三十八>(模仿腾讯QQ的网络状态提示和设置功能实现)
- TCP CWnd protocol
- bzoj 1491: [NOI2007]社交网络
- web:2、httpd的特性和配置详解
- 基于XBee进行ZigBee组网(二)——ZigBee网络与XCTU的使用
- 网络与信息安全监控内容