小编use*_*046的帖子

翻转卡片以获得最大金额

给定N张牌,如果第i张牌在其正面有数字x,那么它将在背面具有-x并且只能进行一次操作,只能以连续顺序翻转任意数量的牌一次.

现在我们需要以这样的方式翻转卡片,即卡片上面的数量总和最大.

示例:如果N = 5且cards []为{-2,3,-1,-4,-2},那么这里的答案是8,因为我们可以翻转最后3张卡来获得配置{-2,3,1,4 ,2}总和为8.

我的方法:

为每个第i个位置寻找每种可能的方式作为起始位置并找到最大值.但是他们对这个问题有更好的解决方案吗?

我的密码:直到现在还没有找到问题

#include<bits/stdc++.h>
using namespace std;
int solve(std::vector<int> const & numbers)
{
    int min_so_far  = numbers[0], min_ending_here = numbers[0];
    size_t begin = 0;
    size_t begin_temp = 0;
    size_t end = 0;
    for(size_t i = 1; i < numbers.size(); i++)
    {
            if(min_ending_here > 0)
            {
                    min_ending_here = numbers[i];
                    begin_temp = i;
            }
            else
            {
                    min_ending_here += numbers[i];
            }

            if(min_ending_here <= min_so_far )
            {
                    min_so_far  = min_ending_here;
                    begin = begin_temp;
                    end = i;
            } …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm

7
推荐指数
1
解决办法
841
查看次数

最大化 AND

给定一个由 n 个非负整数组成的数组:A1, A2, ..., AN。如何找到一对整数 Au, Av (1 ? u < v ? N) 使得 (Au 和 Av) 尽可能大。

示例:让 N=4 和数组为 [2 4 8 10] 。这里的答案是 8

解释

2 and 4 = 0
2 and 8 = 0
2 and 10 = 2
4 and 8 = 0
4 and 10 = 0
8 and 10 = 8
Run Code Online (Sandbox Code Playgroud)

如果 N 可以达到 10^5,该怎么办。我有 O(N^2) 解决方案。但效率不高

代码 :

for(int i=0;i<n;i++){
    for(int j=i+1;j<n;j++){
        if(arr[i] & arr[j] > ans)
        {
            ans=arr[i] & …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm

3
推荐指数
1
解决办法
289
查看次数

标签 统计

algorithm ×2

c++ ×2