01翻轉(zhuǎn)

問題描述

牛牛正在挑戰(zhàn)一款名為01翻轉(zhuǎn)的游戲。游戲初始有A個0,B個1,牛牛的目標就是把所有的值都變?yōu)?,每次操作牛牛可以任意選擇恰好K個數(shù)字,并將這K個數(shù)字的值進行翻轉(zhuǎn)(0變?yōu)?,1變?yōu)?)。牛牛如果使用最少的操作次數(shù)完成這個游戲就可以獲得獎品,牛牛想知道最少的操作次數(shù)是多少?
例如:A = 4 B = 0 K = 3
0000 -> 1110 -> 1001 -> 0100 -> 1111
需要的最少操作次數(shù)為4

輸入描述

輸入為一行:
一共三個整數(shù)A(0 ≤ A ≤ 100,000),B(0 ≤ B ≤ 100,000),K(1 ≤ K ≤100,000).以空格分隔

輸出描述

輸出一個整數(shù),表示最少需要的操作次數(shù)。如果不能完成,則輸出-1

輸入例子

4 0 3

輸出例子

4

分析

總的思路是:先把能翻的1都翻過來,每次翻K個,統(tǒng)計翻了多少次以及還剩下多少個1。剩下的1最多每翻兩次減少2*(總數(shù)字S-K),再考慮一些特殊情況就好了。

note

暫時不能完全理解= =

代碼

#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    int a, b, k;
    scanf("%d%d%d", &a, &b, &k);

    int s = a + b;
    int r = a % k;
    int c = a / k;

    if (a == 0 || r == 0);
    else if ((s <= k) || ((r & 1) && !(k & 1)))
        c = -1;
    else if (!((k + r) & 1) && c > 0 && b + k * c >= 2 * k - (k + r) / 2)
        c++;
    else if (!(r & 1))
        c += 2 * ceil((double)r / (2 * (s - k)));
    else
        c += 2 * ceil((double)(k - r) / (2 * (s - k))) + 1;

    printf("%d\n", c);

    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容