在7月份的codechef挑战中,我的逻辑无法找到错误

时间:2017-07-17 09:59:15

标签: c++

厨师有一个计算器,有两个屏幕和两个按钮。最初,每个屏幕显示数字零。按第一个按钮可将第一个屏幕上的数字增加1,每次单击第一个按钮消耗1个单位的能量。

按第二个按钮可将第二个屏幕上的数字增加当前显示在第一个屏幕上的数字。每次单击第二个按钮都会消耗B单位的能量。

最初计算器有N个能量单位。

现在厨师想知道最大可能的数字是什么,他在计算器的第二个屏幕上,能量有限。 这是链接:https://www.codechef.com/JULY17/problems/CALC/

比赛结束,所以我不是在试图作弊。 这是我解决问题的方法:

public class CustomersViewModel
{
    private readonly MainWindowViewModel _vm;
    public CustomersViewModel(MainWindowViewModel vm)
    {
        _vm = vm;
        NavigationCommand = new DelegateCommand<string>(OnNavigate);
    }

    public DelegateCommand<string> NavigationCommand { get; set; }


    private void OnNavigate(string navPath)
    {
        _vm.CurrentViewModel = new SomeOtherViewModel();
    }
}

我已经尝试过每一个我能想到的测试用例......任何人都可以帮助我找到逻辑中的错误。

2 个答案:

答案 0 :(得分:2)

我认为错误可能是:

1:你没有处理N&lt; = B case

if (n<=b) {
    ans = 0;
}

2:你没有处理子任务2约束

long long int ans = n-b;

3:如果b小于等于n

三次,则最后答案为n-b
if (n<=3*b) {
    ans = n-b;
}

4:寻找直接的方法

k1 = ((n-(b+1))/(2*b))+1;
i2 = (double((n-(3*b)))/(2*b));
i1 = ceil(i2);
i = n-((3*b)+((i1-1)*(2*b)));
ans = ((2*b)*((k1*(k1-1))/2))+(k1*i);
cout << ans;

希望这会有所帮助:)

答案 1 :(得分:0)

这主要是一个数学问题: 与

  • N能量单位
  • B第二屏的能源成本

  • p点击第一个按钮的次数

  • s点击第二个按钮的次数

您尝试最大化

  • s * p

,而

p + B * s <= N

所以

p <= N - B * s

然后

最大化:N * s - B * s²

s0 = 0
s1 = N / B

sMax是(s0 + s1) / 2 - &gt; N / (2*B)

所以最大值是

N²/2B - N²/4B -> N²/4B

所以

std::cin >> n >> b;
std::cout << n * n / b / 4 << std::endl