无法在代码厨师七月挑战中找到我的逻辑错误

Unable to find error in my logic in a codechef july challenge

本文关键字:我的 错误 挑战 代码 七月      更新时间:2023-10-16

Chef有一个计算器,它有两个屏幕和两个按钮。最初,每个屏幕都显示数字零。按下第一个按钮会使第一个屏幕上的数字增加 1,每次单击第一个按钮都会消耗 1 个单位的能量。

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

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

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

比赛结束了,所以我不想作弊。 这是我对问题的解决方案:

#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,b;
cin>>n>>b;
int count = 1;
int ans = n-b;
while((n - count*b)>=0)
{
if(count*(n - count*b)>ans)
ans = count*(n - count*b);
count++;
}
cout<<ans<<endl;
}
return 0;
} 

我已经尝试了我能想到的所有测试用例......谁能帮忙找到我的逻辑中的错误。

我认为的错误可能是:

1:您没有处理 N<=B 案例

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

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

long long int ans = n-b;

3:最后答案将是 n-b,如果 b 小于 n 的三倍

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;

希望这对:)有所帮助

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

  • 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->N / (2*B)

所以最大值是

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

所以

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