[编程题] 01翻转

来源:互联网 发布:网络推广要学哪些课程 编辑:程序博客网 时间:2024/06/08 02:04

牛牛正在挑战一款名为01翻转的游戏。游戏初始有A个0,B个1,牛牛的目标就是把所有的值都变为1,每次操作牛牛可以任意选择恰好K个数字,并将这K个数字的值进行翻转(0变为1,1变为0)。牛牛如果使用最少的操作次数完成这个游戏就可以获得奖品,牛牛想知道最少的操作次数是多少?
例如:A = 4 B = 0 K = 3
0000 -> 1110 -> 1001 -> 0100 -> 1111
需要的最少操作次数为4

输入描述:
输入为一行:
一共三个整数A(0 ≤ A ≤ 100,000),B(0 ≤ B ≤ 100,000),K(1 ≤ K ≤100,000).以空格分隔

输出描述:
输出一个整数,表示最少需要的操作次数。如果不能完成,则输出-1

输入例子:
4 0 3

输出例子:
4


bfs模板题

#include"iostream"#include"queue"#include"string.h"using namespace std;bool sign[200100];int he;int a,b,k;struct node{    int x,step;};int bfs(){    node mm,nn;    mm.x=a;    mm.step=0;    sign[mm.x]=true;    queue<node> jj;    jj.push(mm);    while(!jj.empty())    {        nn=jj.front();        jj.pop();        if(nn.x==0)        {            return nn.step;        }        for(int i=0;i<=k;i++)        {            if(i<=nn.x&&(k-i)<=he-nn.x)            {                mm=nn;                mm.x=mm.x+k-2*i;                if(!sign[mm.x])                {                    sign[mm.x]=true;                    mm.step++;                    jj.push(mm);                }            }        }    }    return -1;}int main(){    memset(sign,0,sizeof(sign));    cin>>a>>b>>k;    he=a+b;    cout<<bfs()<<endl;    return 0;}
0 0
原创粉丝点击