對於給定的一個長度爲N的正整數數列A[i],現要將其分成連續的若干段,並且每段和不超過M(可以等於M),問最少能將其分成多少段使得滿足要求。
輸入輸出格式
輸入格式:
輸入文件divide_a.in的第1行包含兩個正整數N,M,表示了數列A[i]的長度與每段和的最大值,第2行包含N個空格隔開的非負整數A[i],如題目所述。
輸出格式:
輸出文件divide_a.out僅包含一個正整數,輸出最少劃分的段數。
輸入輸出樣例
5 6 4 2 4 5 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永葆青春