Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何不多次使用元素?_C++ - Fatal编程技术网

C++ 如何不多次使用元素?

C++ 如何不多次使用元素?,c++,C++,问题是:输入n(2k; 整数[n]; 对于(int i=0;i>数字[i]; } int结果=0; 对于(int j=0;jn; 标准:cin>>k; std::向量v(n); 用于(自动和电气:v){ 标准:cin>>e; } 排序(v.begin(),v.end()); if(v.empty()) { std::cout 1)我们不做作业2)如果不是,请告诉我们出错的原因排序输入,然后使用线性解决方案(两个迭代器,一个从开始,一个从结束)。1)这不是作业,很久以来一直在尝试解决这个难题(我不

问题是:输入n(2
#include <iostream>

using namespace std;

int main(){
    int n;
    int k;
    cin >> n;
    cin >> k;
    int numbers[n];
    for (int i = 0; i < n; i++){
        cin >> numbers[i];
    }
    int result = 0;
    for (int j = 0; j < n; j++){
         for (int l = j + 1; l < n; l++){
             if (numbers[j] + numbers[l] == k){
                 result += 1;
                 break;
             }
         }
     }
    cout << result;
    return 0;
}
输出应为: 2(自2+2、2+2起) 我的建议是: 4(2+2,2+2,2+2,2+2)

例2: 输入:

我的输出: 2(因为1+3=4,5+(-1)=4)-哪个是正确的
我唯一的问题是我不能跳过已使用的元素。

使用一个数组,在该数组中保存元素是否已使用(如注释中所述):

#包括
使用名称空间std;
//包含10^6个元素的数组,
//(==最大数量的数字)
布尔使用了[1000000];
int main(){
int n;
int k;
cin>>n;
cin>>k;
整数[n];
对于(int i=0;i>数字[i];
}
int结果=0;
对于(int j=0;jcout您可能要做的是对输入进行排序,并从两侧进行线性处理。
(这也将复杂性从
O(n²)
降低到
O(n log n)

intmain(){
int n;
int k;
标准:cin>>n;
标准:cin>>k;
std::向量v(n);
用于(自动和电气:v){
标准:cin>>e;
}
排序(v.begin(),v.end());
if(v.empty())
{

std::cout 1)我们不做作业2)如果不是,请告诉我们出错的原因排序输入,然后使用线性解决方案(两个迭代器,一个从开始,一个从结束)。1)这不是作业,很久以来一直在尝试解决这个难题(我不熟悉编码).2)所有元素只能使用一次,但正如您所看到的,在下一个for循环中,已经使用的元素仍然有效。问题是我无法“清除”元素,因此它仍然可用,从而导致错误的结果
整数[n]无效的C++,因为它使用VLA扩展。使用<代码> STD::向量< /代码>。如果它不是一个家庭作业,比最简单的解决方案(最古老的解决方案)就是使用一个标志。标志始终为0,但当找到一个元素时,它会被设置为1。只有当标志为0时,才能检查新元素。在序列检查完成后,请记住再次将标志设置为零。谢谢,这非常有帮助!但有些输出似乎不正确。2
int
之类的限制是错误的输入这些限制,您至少需要
std::int32\t
。这些限制在这里是为了知道要使用的类型和预期的复杂性。啊,我明白了。另外,当我在C++11上运行代码时,它会说“24:17:警告:有符号和无符号整数表达式之间的比较[-Wsign compare]”。这是怎么回事?它应该是
std::size\u t left=0;
因为
auto
被推断为
int
,而
right
的类型与
v.size()相同。
5 4
2 2 2 2 2
5 4
1 3 5 2 -1
#include <iostream>

using namespace std;

//array with 10^6 elements, 
//(== max number of numbers)
bool used[1000000];

int main(){
    int n;
    int k;
    cin >> n;
    cin >> k;
    int numbers[n];
    for (int i = 0; i < n; i++){
        cin >> numbers[i];
    }
    int result = 0;
    for (int j = 0; j < n; j++){
        //check if element has been used
         if(used[j] == 1) {
            continue;
         }
         for (int l = j + 1; l < n; l++){
            //check if element has been used
            if(used[l] == 1 ) {
                continue;
            }
             if (numbers[j] + numbers[l] == k){
                 //mark elements as used
                 used[j] = 1;
                 used[l] = 1;
                 result += 1;
                 break;
             }
         }
     }
    cout << result;
    return 0;
}
int main(){
    int n;
    int k;
    std::cin >> n;
    std::cin >> k;
    std::vector<int> v(n);
    for (auto& e : v){
        std::cin >> e;
    }
    std::sort(v.begin(), v.end());
    if (v.empty())
    {
        std::cout << 0;
        return 0;
    }

    std::size_t counter = 0;
    auto left = 0;
    auto right = v.size() - 1;
    while (left < right) {
        const auto sum = v[left] + v[right];
        if (sum < k) {
            ++left; 
        } else if (k < sum) {
            --right;
        } else { // sum == k
            // It is here that we may have special handling to handle duplicates
            // when v[left] == v[left+1].
            // Here, it is simple, no special cases :-)
            ++counter;
            ++left;
            --right;
        }
    }
    std::cout << counter;
}