2015 ACM/ICPC Asia Regional Hefei Online
方法:先把D的二进制最高位前加0,如1101则为01101,然后从后面开始选出为0的位置:再符合s1 <= L <= s2的情况下把这个0改为1,然后处理该位置以后的数填。
处理方法为:从低位开始填1(尽可能少,使L的值刚好为s2就可以了),再后面的就填0了。
这样最先得到的就是答案,刚开始时想if各种情况,但是思维容易乱
#include <stdio.h>
#include <string.h>
#define ll long long
int binary[40];
int main()
{
int t, D, s1, s2, i, p, j, L, aft, Hz, k;
ll res, v;
scanf("%d", &t);
k = 1;
while(t--)
{
scanf("%d %d %d", &D, &s1, &s2);
p = 0;
L = 0;//1的个数
Hz = 0;
while(D)
{
binary[p] = D % 2;
if(binary[p] == 0&&!Hz) Hz = p;//出现0
if(binary[p] == 1) L++;
D = D>>1;
p++;
}
binary[p++] = 0;
aft = 0;
for(i = 0;i < p;i++)
{
if(binary[i] == 1) aft++;
bool judge = 0;
if(binary[i] == 0)
{
if(aft >= 1){
binary[i] = 1;
aft--;
}else if(L + 1 <= s2){
binary[i] = 1;
L++;
}
else continue;
judge = 1;
for(j = 0;j <= i - 1;j++)
{
if(L - aft < s1){
binary[j] = 1;
aft--;
}
else binary[j] = 0;
}
}
if(judge) break;
}
res = 0;
for(i = 0;i < p;i++){
v = 1;
for(j = 0;j < i;j++) v *= 2;
res += binary[i] * v;
}
printf("Case #%d: %lld\n", k++, res);
}
}