#UVa:1121-Subsequence

灆洢 2018-05-16 20:05:36

找出最短長度的數列可以比指定的數 S 大。

利用記住連續數列的最前端和最後端,慢慢從後面增長。如果總和超過了指定數 S ,則從最前端縮回來,直到數列總和比 S 小為止。

P.S. 記得處理總和沒辦法超過 S 的狀況。

C++(0.020)

/*******************************************************/
/* UVa 1121 Subsequence                                */
/* Author: Maplewing [at] knightzone.studio            */
/* Version: 2018/05/16                                 */
/*******************************************************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;

int main(){
  int N, S;
  while(scanf("%d%d", &N, &S) != EOF){
    vector<int> sequence;
    for(int i = 0 ; i < N ; ++i){
      int number;
      scanf("%d", &number);
      sequence.push_back(number);
    }

    int sum = 0, minLength = N+1, front = 0;
    for(int i = 0 ; i < N ; ++i ){
      sum += sequence[i];

      while(sum >= S){
        minLength = min(minLength, i - front + 1);
        sum -= sequence[front];
        ++front;
      }
    }

    printf("%d\n", (minLength == N+1)? 0 : minLength);
  } 
  return 0;
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料