typedef long long ll;
ll maxtokens(vector<ll>::iterator beg, vector<ll>::iterator end)
{
ll min, j = 0, n = end - beg;
if(n == 1)
return *beg;
for(int i = 1, min = *beg; i < n; i++)
{
ll t = *(beg + i);
if(min > t)
{
min = t;
j = i;
}
// cout << min << " " << (*(beg + i)) << endl;
}
// cout << min << " " << j << endl;
if(j == 0)
return n*min;
for(int i = 0; i < j; i++)
*(beg + i) -= min;
return maxtokens(beg, beg + j) + n*min;
}
Run Code Online (Sandbox Code Playgroud)
这是用于 codechef 中的问题的函数。我发现奇怪的是 min 的值,所以我使用调试器在每一步查看 min 的值,发现 min 的值与循环内的预期一致,但是一旦退出,存储在 min 内的 for 循环值更改为一个垃圾值。如果我在 for 循环之前写 min=*beg,这个错误就会被删除。我不明白为什么 min 的值会自行改变。
ll 代表 long long int
你能告诉我我哪里做错了吗?
我不知道该使用哪个标签,所以我只使用了 c++,请告诉我我应该使用哪些其他标签以备将来参考。
虽然我认为这不会有任何帮助,但这里有问题https://www.codechef.com/LRNDSA02/problems/STUPMACH
提前致谢。
您正在隐藏min循环中的变量。在这个片段中
int min = 1;
for (int i = 0, min = 5; i < n; ++i) // this declares a new 'min'
// ...
Run Code Online (Sandbox Code Playgroud)
将min在for循环是一个比外面不同。因此,min对循环内部的任何更改都不会影响min循环外部。
请注意,在表达式中
int i = 0, min = 5;
Run Code Online (Sandbox Code Playgroud)
双方 i并min有新的变数。
在这种情况下,更简单的方法是使用算法,如下所示:
int min = *std::min_element(beg, end);
Run Code Online (Sandbox Code Playgroud)
这完全避免了必须编写循环。
| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |