ganpatrao ganu Ответов: 1

У меня есть проблема с кодом C++.


#include <bits/stdc++.h>
#include<iostream>
#include <vector>
using namespace std;
long long int n,q;
vector<int>arr;
vector<int>ans;
int main(){
    int i,j;
    cin>>n;
    cin>>q;
    for (int i = 0; i < n; ++i){
    cin>>arr[i];
    }
    int pos_val,l,r;
    for (int j = 0;j < q; ++j){
    cin>>pos_val>>l>>r;
    if (pos_val == 1){
        arr[l-1]=r;
    }
    else if (pos_val == 2){
        vector<int>arr2 = arr;
        int N = sizeof(arr2) / sizeof(int);
        ans.push_back(isPossibleTriangle(arr2, N));
        }
    }
    int p;
    for (p=0;p<=q;p++){
        cout<<ans[p];
    }
    return 0;
}
int isPossibleTriangle(vector<int>arr, int N){
    if (N < 3)
            return false;
    int cnt = 0;
    sort(arr.begin(),arr.end());;
    for (int i=0; i<N-2; i++){
        if (arr[i] + arr[i+1] > arr[i+2]){
            if (cnt<(arr[i] + arr[i+1] + arr[i+2])){
                cnt += (arr[i] + arr[i+1] + arr[i+2]);
            }
        }
    }
    return cnt;
}



Пример:
Формат ввода:(точка с запятой означает новую строку)

5 4   \n;
3 1 8 9 7   \n;
2 1 5   \n;
1 2 12   \n;
2 1 3   \n;
2 2 5   \n;

Output:
24   \n;
0   \n;
29   \n;


Первый запрос просит нас найти максимальный периметр треугольника, используя некоторые из элементов {3, 1, 8, 9, 7}. Мы можем взять элементы 7, 8 и 9 и построить треугольник, используя эти три элемента в качестве длины сторон. Этот треугольник имеет периметр 7 + 8 + 9 = 24, что является максимально возможным периметром. Следовательно, ответ-24.

Второй запрос просит нас изменить второй элемент на 12.

Третий запрос предлагает нам найти максимальный периметр треугольника, используя некоторые из элементов {3, 12, 8}. Эти три элемента не образуют треугольника, поэтому ответ равен 0.

Четвертый запрос просит нас найти максимальный периметр треугольника, используя некоторые из элементов {12, 8, 9, 7}. Мы можем взять элементы 8, 9 и 12 и построить треугольник, используя эти три элемента в качестве длины сторон. Этот треугольник имеет периметр 8 + 9 + 12 = 29, что является максимально возможным. Следовательно, ответ-29.

Что я уже пробовал:

Я программист на python.Я решал вопрос на c++, и у меня возникли проблемы.Пожалуйста, помогите мне.

Patrice T

А какие проблемы вы планируете рассказать?

jeron1

Какие конкретно проблемы у вас возникли? То, что он делает, это не то, что вы ожидаете. Чем больше деталей, тем лучше.

[редактировать]
Взгляд на первые несколько строк показывает,

вектор<int>arr;
вектор<int>ans;
тап_п(){
int i,j;
cin>>n;
cin>>q;
for (int i = 0; i < n; ++i){
cin>>arr[i]; <=======попытка добавить элементы в вектор таким образом не работает, он не определен попробуйте прочитать int, а затем используйте push_back()
}

1 Ответов

Рейтинг:
4

John R. Shaw

Это похоже на домашнюю работу, но я предоставлю отзыв.

Определение I и J
Либо объявите его сверху, как в C, либо в for(int i = 0;...), не нужно делать и то, и другое.

Вам нужно предоставить прототип функции, прежде чем пытаться вызвать ее, иначе комплиер не распознает ее при виде вызова.
int isPossibleTriangle(vectorarr, int N);

Векторы-это динамические массивы, которые вы не можете просто индексировать, не добавляя в них элементы.

Я внес некоторые изменения в приведенный ниже код, чтобы исправить ошибки и некоторые другие вещи. Теперь у вас, по крайней мере, есть что-то, что будет компилироваться и, вероятно, не будет выдавать никаких исключений.

Повеселиться :)

#include<iostream>
#include <vector>
#include <algorithm>

using namespace std;

int isPossibleTriangle(vector<int>& arr);

long int n,q;
vector<int>arr;
vector<int>ans;

int main()
{
    cin >> n;
    cin >> q;
    for (int i = 0; i < n; ++i)
	{
		int value;
		cin >> value;
		arr.push_back(value);
    }

    int pos_val,l,r;
    for (int j = 0;j < q; ++j)
	{
		cin >> pos_val >> l >> r;
		if (pos_val == 1)
		{
			arr[l-1] = r;
		}
		else if (pos_val == 2)
		{
			ans.push_back(isPossibleTriangle(arr));
        }
    }
    for (int p = 0; p < ans.size(); ++p)
	{
        cout << ans[p] << endl;
    }
    return 0;
}

int isPossibleTriangle(vector<int>& arr)
{
    int cnt = 0;
    if (arr.size() > 2)
	{
		sort(arr.begin(),arr.end());
		for (int i=0; i<arr.size()-2; ++i)
		{
			if (arr[i] + arr[i+1] > arr[i+2])
			{
				if (cnt<(arr[i] + arr[i+1] + arr[i+2]))
				{
					cnt += (arr[i] + arr[i+1] + arr[i+2]);
				}
			}
		}
	}
    return cnt;
}


ganpatrao ganu

Спасибо, сэр, это так мило с вашей стороны!

ganpatrao ganu

Сэр в int isPossibleTriangle(vector<int>& arr) я хочу, чтобы вектор массива имел значения только от l-1 до r.Но вместо этого он принимает все значения.Я пытался использовать
вектор слово const и Л;int&ГТ;а(&ампер;модуль arr[л-1],&ампер;модуль arr[Р]);
и пытался заменить ОБР в фикцию, но это дает мне ошибку компиляции.
Как правильно это сделать?