1. 程式人生 > 其它 >Codeforces Round #104 (Div. 1) B. Lucky Number 2

Codeforces Round #104 (Div. 1) B. Lucky Number 2

連結

題意

要求輸出一個只含有4和7的字串滿足: 只有a1個4,a2個7,a3個47,a4個74 不可能則輸出-1 輸入格式為: 一排四個數分別為a1,a2,a3,a4

分析:

首先我們看一下47和74的關係,474444 這樣47和74的數量是一樣的, 4747 這樣47比74多一個,沒有多兩個的情況,所以我們可以先比較這兩個的數量,判斷一下是否可能有答案。

其次:我們看47與74最少怎麼組成,因為我們組成47和74之後可以把多的7或者4放到對應的位置上,就是讓原本組成47,74的位置上讓其重複即可。

然後我們看如果47比74多的話一定時候4747這樣的4在前,7在後。如果74多的話就是7在前,4在後。然後相等我們先用4747試下,因為要滿足最小。

然後 通過組數求出最少需要的4和7的數量。 數量不夠肯定這樣不行。

之後我們迴圈找到第一個放4的地方直接將剩餘的4也都放到這個位置上,保證最優最小,同樣我們把剩餘的7放到最後的7那個地方。

ll num_4, num_7, num_47, num_74;

bool solve()
{
    if(abs(num_47 - num_74) > 1) return false;///最多相差1 否則一定構不成

    for(int top = 4; top < 8; top += 3)
    {
        if(top == 4 && num_47 < num_74) continue; ///4開頭但是 74的數量多 ,所以不行
        if(top == 7 && num_47 > num_74) continue; ///同理
        ll m4 = (top == 4 ? 1 : 0) + num_74;/// 需要4的數量
        ll m7 = (top == 7 ? 1 : 0) + num_47;/// 需要7的數量
        if(m4 > num_4 || m7 > num_7) continue; ///數量不夠
        ll sum = num_47 + num_74 + 1; ///構成符合47和74需要多長
        ll yu4 = num_4 - m4; ///還剩多少4
        ll yu7 = num_7 - m7; ///還剩多少7
        for(int i = 0; i < sum; i++)
        {
            int p = ((top == 4) ^ (i % 2 == 0) ^ 1) ? 4 : 7;// 該放什麼了
            printf("%d", p);
            if(i <= 1 && p == 4)//只有前兩個放4是最優的方案
                for (int i = 0; i < yu4; ++i)
                {
                    printf("4");///順著把4全放上面
                }
            if (i >= sum - 2 && p == 7)///只有最後連個放7是最優方案
            {
                for (int i = 0; i < yu7; ++i)
                {
                    printf("7");///順著把7全部放上
                }
            }
        }
        puts("");
        return true;
    }
    return false;
}