您的位置:首页 > 其它

51Nod 1483 化学变换(思维+暴力)

2017-08-25 11:29 232 查看

51Nod 1483 化学变换

 思维题
  
//找出每个数通过乘二除二所能得到的所有的数,
//并且记录得到这个数乘二除二的次数和有多少个数能转换为这个数
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int MAXN=200005;
const int INF=0x3f3f3f3f;
int a[MAXN],vis[MAXN],sp[MAXN];
void handle(int t)
{
int temp=t;
int step=0;
//通过这个数乘二得到的所有数
while(temp<=1e5)
{
vis[temp]++;
sp[temp]+=step++;
temp<<=1;
}
step=0;
//通过这个数除二得到的所有数
while(t)
{
//当这个数是奇数时,除2之后还需要向回乘二
if((t&1)&&t!=1)
{
//先除二
t>>=1;
step++;
sp[t]+=step;
vis[t]++;
//向回乘二
int tt=t;
int tstep=step;
while(tt<=1e5)
{
tt<<=1;
tstep++;
vis[tt]++;
sp[tt]+=tstep;
}
}
//除二直到遇见奇数
else
{
t>>=1;
step++;
sp[t]+=step;
vis[t]++;
}
}
}
int main(void)
{
int n;
scanf("%d",&n);
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
handle(a[i]);
int ans=INF;
//遍历所有能由这n个数乘二除二得到的
for(int i=1;i<=MAXN;i++)
{
if(vis[i]==n)
b931
ans=min(ans,sp[i]);
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: