Luogu1181數列分段

題目描述

對於給定的一個長度爲N的正整數數列A[i],現要將其分成連續的若干段,並且每段和不超過M(可以等於M),問最少能將其分成多少段使得滿足要求。

輸入輸出格式

輸入格式:

輸入文件divide_a.in的第1行包含兩個正整數N,M,表示了數列A[i]的長度與每段和的最大值,第2行包含N個空格隔開的非負整數A[i],如題目所述。

輸出格式:

輸出文件divide_a.out僅包含一個正整數,輸出最少劃分的段數。

輸入輸出樣例

輸入樣例#1:
5 6
4 2 4 5 1
輸出樣例#1:
3

說明

對於20%的數據,有N≤10;

對於40%的數據,有N≤1000;

對於100%的數據,有N≤100000,M≤10^9,M大於所有數的最小值,A[i]之和不超過109。

將數列如下劃分:

[4][2 4][5 1]

第一段和爲4,第2段和爲6,第3段和爲6均滿足和不超過M=6,並可以證明3是最少劃分的段數。

這題是貪心。對於每個元素a,如果能歸入前面一個區間,而不歸入,那麼就可能造成後面區間的超值,既區間增多。所以要能歸入前面的就歸入,貪心想法證畢。

這題主要是訓練編程的準確性。

#include
#include
#include
using namespace std;
int n,m,ans,sum;
int num[100010];


int main()
{
  scanf("%d %d",&n,&m);
  for(int i=1;i<=n;i++)
     scanf("%d",&num[i]);
  int ans=1,sum=0;
  for(int i=1;i<=n;i++)
  {
      if(sum+num[i]<=m) sum+=num[i];
      else
      {
          ans++;
          sum=num[i];
      }
  }
  printf("%d",ans);
  return 0;
}

先初始化有一個區間,如果元素A歸不入前面的區間,那麼就讓它成爲一個新區間。這樣可以保證正確。

祝大家學習愉快,願OI永葆青春

發佈了30 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章