您的位置:首页 > 其它

hdoj5491

2015-09-29 13:20 134 查看
http://acm.hdu.edu.cn/showproblem.php?pid=5491

补一下之前网络赛的水题 写的好乱

就是个贪心模拟

让低位为1

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <fstream>
#include <math.h>
#include <iomanip>

using namespace std;
typedef long long ll;
typedef pair<int, int> Pii;

const int INF = 0x7fffffff;
ll n[100], m[100], ans[100];  //n  二进制  m前缀 ans 答案的二进制
ll x, y, z;
int main()
{
int t;
scanf("%d", &t);
for (int cs = 1; cs <= t; cs++) {
memset(n, 0, sizeof(n));
memset(m, 0, sizeof(m));
memset(ans, 0, sizeof(ans));
int i;
ll tem = x;
scanf("%I64d%I64d%I64d", &x, &y, &z);
for (i = 0; x; i++) {
n[i] = x % 2;
x /= 2;
}
x = tem;
ll len = i;
//      for(int i=0;i<len;i++) cout<<n[i]<<" ";
//      cout<<endl;
for (int i = 0; i < len; i++) {
m[i + 1] = m[i] + (n[i] == 1 ? 1 : 0);
}
for (int i = len + 1; i <= max(len + 1, z); i++) m[i] = m[i - 1];
ll totol = m[len];
for (int i = 1; i <= max(z, len + 1); i++) {
int tt = 0;
if (n[i - 1] == 0) {
tt = totol - m[i] + i;
if (tt >= y && tt - i + 1 <= z) {     //满足要求
int res = y - (totol - m[i]) - 1;
for (int j = 1; j <= max(z, len + 1); j++) {
if (j <= i) {
if (res > 0) ans[j] = 1;      //低位赋值1
else ans[j] = 0;
res--;
}
else ans[j] = n[j - 1];
}
ans[i] = 1;
break;
}
}
}
//      for(int i=1;i<=len;i++) cout<<m[i]<<" ";
ll as = 0;         //注意用ll
for (int i = max(z, len + 1); i > 0; i--) {
as *= 2;
as += ans[i];
}
printf("Case #%d: %I64d\n", cs, as);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: