Как найти подпоследовательность, сумма которой удовлетворяет требованиям?

#c #sequence #greedy #sliding-window

#c #последовательность #жадный #скользящее окно

Вопрос:

Я ищу способ поиска минимального последующего размера из последовательности, сумма которой удовлетворяет минимальной сумме, необходимой из вопроса.
Примеры (обратите внимание, что индекс начинается с 0):

 arr[]={5, 1, 3, 5, 10, 7, 4, 9, 2, 8}  
sum = 15  
  

итак, ответ должен быть 2, потому что минимальный размер подпоследовательности равен от

 a[3]-a[4].  
arr[]={1, 2, 3, 4, 5}  
sum = 11  
  

итак, ответ должен быть 3, потому что минимальный размер подпоследовательности равен от

 a[2]-a[4].  
  

Я попытался использовать жадный метод с кодом ниже:

 #include <bits/stdc  .h>
using namespace std;
int main(){
    vector <int> sequence;

    int sequenceSize, sumAsked;
    cin>>sequenceSize>>sumAsked;
    
    int sum=0, count=sequenceSize, front=0, back=sequenceSize-1;

    for(int i=0; i<sequenceSize; i  ){
        int j;
        cin>>j;
        sequence.push_back(j);
        sum =j;
    }
    if(sum<sumAsked){
        cout<<0<<endl;
    }
    else{
        while(sum>sumAsked){
            if(sequence[front]>=sequence[back]){
                sum-=sequence[back];
                back--;
                count--;
            }
            else{
                sum-=sequence[front];
                front  ;
                count--;
            }
        }
    cout<<count 1<<endl;
    }
}
  

Код, похоже, работает в обоих тестовых примерах, но он ошибся в онлайн-оценке. Есть ли лучший код или метод для меня, с которым я могу работать?

Комментарии:

1. Для этого можно использовать вариант алгоритма Кадане.

2. @MohitSharma Я так думаю, но как именно отметить текущие индексы массива, используемые для суммы?

Ответ №1:

Я действительно получил accepted ответ на судью, и он выглядел так,

 #include <bits/stdc  .h>
#define f first
#define s second

typedef long long int lli;
using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int sequenceSize, sumAsked, sum=0;
    cin>>sequenceSize>>sumAsked;
    vector <int> sequence;
    for(int i=0; i<sequenceSize; i  ){
        int j;
        cin>>j;
        sequence.push_back(j);
        sum =j;
    }
    if(sum<sumAsked) cout<<0<<endl; //whether to check it's possible or not to get the answer,
    else{                           //otherwise it prints 0
        vector <int> note;
        int currentPos=0, currentSum=0, count=0;
        int temp=sequence[currentPos];
        for(int i=0; i<sequenceSize; i  ){
            currentSum =sequence[i];    //here we add the sum one by one from the sequence
            count  ;
            while(!(currentSum-temp<sumAsked)){ //here we reduce the size of the 'window'
                currentSum-=temp;               //until it's just enough to hold the sum
                count--;
                cur  ;
                temp=sequence[cur];
                note.push_back(count); //to take note all possible 'window' size
            }
        }
        for(int i=0; i<note.size(); i  ){
            count=min(count, note[i]); //to search the best possible minimum answer
        }
        cout<<count<<endl;
    }
    return 0;
}
  

Я думаю, что возможно, однако, не принимать во внимание весь ответ по вектору, но я думаю, что это уже достаточно хорошо.