Błąd wykonanie programu.

0

Cześć,

mam takie zadanie:
http://solve.edu.pl/contests/download_desc/2096

i taki kod:

#include <bits/stdc++.h>
using namespace std;

long long int tab2[200005];
int main ()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);	
        long long int INF=1e9;
        tab2[0]=0;
        for (int i=1; i<=200005; i++)
        {
                tab2[i]=INF;
        }
        int n;
        cin>>n;
        for (int i=0; i<n; i++)
        {
                long long int a;
                cin>>a;
                for (int j=200005; j>=0; j--)
                {
                        if(tab2[j]!=INF)
                        {
                                tab2[j+a]=min(tab2[j]+1, tab2[j+a]);
                        }
                }
        }
     
        for (int i=0;i<200005;i++){
		if (tab2[i]==INF){
			cout<<i;
			return 0;
		}
	}

}


5 testów przechodzi a potem pokazuje mi błąd wykonania i nie wiem dlaczego :-(
Może ktoś widzi błąd?

1

Bez patrzenia w treść, błędy:

  1. i<=200005
  2. int j=200005
  3. tab2[j+a] gdy tymczasem możesz mieć takie wartości j=200005 a=100000000000
0

Niestety nie mam pomysłu jak to zmienić:(
Nie wiem jak sobie poradzić z tym, że wychodzę poza tablice:(

0

long long int tab2[200005];

pierwszy element tablicy ma index 0, ostatni 200004

#include <bits/stdc++.h>
using namespace std;

long long int tab2[200005];
int main ()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); 
        long long int INF=1e9;
        tab2[0]=0;
        for (int i=0; i<200005; i++)
        {
                tab2[i]=INF;
        }
        int n;
        cin>>n;
        for (int i=0; i<n; i++)
        {
                long long int a;
                cin>>a;
                for (int j=200004; j>=0; j--)
                {
                        if(tab2[j]!=INF)
                        {
                                tab2[j+a]=min(tab2[j]+1, tab2[j+a]);
                        }
                }
        }

        for (int i=0;i<200005;i++){
        if (tab2[i]==INF){
            cout<<i;
            return 0;
        }
    }

}
0

Mam takie monety 2 1 1 10 9 sortuję żeby mieć 1 1 2 9 10. Zatem program rozpatruje monety po kolei 1 1 2 9 10.

Monety: 1 1 mogę wydać nimi kwoty 0, 1, 2. Ale 3 jeszcze nie umiem wydać (może będzie się dało po rozpatrzeniu kolejnych monet).
Rozpatruję zatem kolejną monetę, czyli 2.
Jeśli do tej pory umiałem wydać 0, 1, 2, to teraz umiem wydać 0, 1, 2 oraz dodatkowo 0+2, 1+2, 2+2, czyli łącznie 0, 1, 2, 3, 4.
OK, idę dalej.
Załóżmy że przeszedłem już przez monety 1 1 2. Wiem że da się wydać kwoty 0, 1, 2, 3, 4, ale 5 jeszcze nie umiem wydać.
Rozpatruję kolejną monetę, czyli 9.
Co mi to daje? Potrafię wydać 0, 1, 2, 3, 4, ale teraz dodatkowo też 0+9, 1+9, 2+9, 3+9, 4+9, czyli razem 0, 1, 2, 3, 4, 9, 10, 11, 12, 13.
W tym momencie jestem już pewny że 5 nie będzie dało się nigdy wydać. Bo kolejne monety, które będę rozpatrywał, będą większe lub równe 9.
Stop. Zatem wynik to 5.

Jak to zapisać?

1

Chyba tak to będzie :P

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

using namespace std;

void sortFnct(int* tab, int x, int y);
void walk(int* tab);
void printVec(vector<int> vecToPrint);
int findValue(vector<int> vec);

int main()
{
    int tab[] = {2,1,1,10,9};
    sortFnct(tab, 0, 5);
    walk(tab);
    
    return 0;
}

void sortFnct(int* tab, int x, int y)
{
    int i, j, t, v;
    i = x;
    j = y;
    v = tab[x];
    do
    {
        while(v > tab[i]) i++;
        while(v < tab[j]) j--;
        if(i <= j)
        {
            t = tab[i];
            tab[i] = tab[j];
            tab[j] = t;
            i++;
            j--;
        }
    }
    while(i <= j);
    if(x < j) sortFnct(tab, x, j);
    if(i < y) sortFnct(tab, i, y);
}

void walk(int* tab)
{
    vector<int> kwoty;
    kwoty.push_back(0);
    
    kwoty.push_back(tab[0]);
    kwoty.push_back(tab[0]+tab[1]);
    
    for(int i=2;tab[i]<=9;i++){
        int size = kwoty.size();
        for(int j=0;j<size;j++){
            if(!(find(kwoty.begin(), kwoty.end(), kwoty[j]+tab[i]) != kwoty.end())){
                kwoty.push_back(kwoty[j]+tab[i]);
            }
        }
    }
    printVec(kwoty);
    int var = findValue(kwoty);
    cout<<"Solve="<<var<<endl;
}

void printVec(vector<int> vecToPrint)
{
    cout<<"Printing vector...\n";
    for(int i : vecToPrint)
        cout<<i<<endl;   
}

int findValue(vector<int> vec)
{
    int last = vec.size() - 1;
    int solve;
    for(int i=0;i<last;i++)
    {
        if(vec[i]!=i)
        {
            solve = i;
            break;
        }
    }
    return solve;
}

1

Mam tak:

#include <bits/stdc++.h>
using namespace std;
long long int money[200005];
int main ()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin>>n;
	for (int i=0; i<n; i++)
	{
		cin>>money[i];
	}
	sort (money, money+n);	
    if (money[0]>1){
        cout<<1;
    return 0;
    }
    
	long long wynik=money[0];
	for (int i=1; i<n; i++)
    {
	    if(money[i]>wynik+1) break;
	    else wynik+=money[i];
	} 
	cout<<wynik+1;
	
	
}


1 użytkowników online, w tym zalogowanych: 0, gości: 1