C ++初学者算法分配

时间:2017-12-08 19:01:23

标签: c++ c++11 c++14

我有一个任务,听起来像这样:"射手有黑色和白色箭头,他只能用白色箭头和黑色鸭子用黑色箭头射击白色鸭子。鸭群成群,大小如下:一,二,三,五,八等,所以基本上都是斐波那契数。这些组中的鸭子是有序的,这样你就不会发现两只相同颜色的鸭子彼此靠近,每组都以白鸭子开头(例如,对于有5只鸭子的群体:白色黑色白色黑色白色)。如果他可以杀死整个组,弓箭手只能杀死鸭子。"

当给出白色箭头(ka)和黑色箭头(kb)的数量时,我必须说有多少组射手被杀,每种类型的箭头都剩下多少。

int ka, kb;
cin >> ka >> kb;

int total_rows{0};
for(int current_group{1}, previous_group{1}; ka+kb >= current_group; ++total_rows)
{
    //see which of the arrows he shoots
    for(int i=1; i <= current_group; ++i)
    {
        if(i%2 == 1)
            --ka;
        else
            --kb;
    }

    // swap the 2 fib numbers so we can get the next one
    swap(current_group, previous_group);

    current_group += previous_group;
}

cout << total_rows << ' ' << ka << ' ' << kb;  

如果我键入,例如9和10,我应该得到4,2,6。我得到了一些与此无关的东西......

1 个答案:

答案 0 :(得分:0)

在计算将使用多少箭头时,可能会采用稍微不同的方法。我们知道鸭子是交替的,这意味着对于奇数组,你需要额外的白色箭头,否则每种颜色使用的数量将是N / 2

#include <iostream>

int next_group()
{
    static int prev = 0;
    static int next = 1;

    int res = prev + next;
    prev = next;
    next = res;

    return next;
}

int main()
{
    int white, black;
    std::cin >> white >> black;

    int groups = 0;
    while (true)
    {
        int n = next_group();
        int arrows = n % 2 == 0 ? n / 2 : (n - 1) / 2;

        if (n % 2 == 0)
        {
            if (arrows > white || arrows > black)
                break;
        }
        else
        {
            if (arrows + 1 > white || arrows > black)
                break;

            white--;
        }

        white -= arrows;
        black -= arrows;
        groups++;

    }

    std::cout 
        << "Complete groups eliminated: " << groups 
        << "\nWhite arrows left: " << white 
        << "\nBlack arrows left: " << black 
        << std::endl;



    system("pause");
    return 0;
} 

enter image description here