刷题Day4_2之又做了一道水题
题目来源: P1181 数列分段Section I
题解思路:
题目里有如下几个关键信息:
(1)连续若干段
(2)每段和被限制在M
由这两个关键的信息就能判断出,本题应该是利用贪心的思想来解决。首先,其解法具有最优子结构的特征,因为要连续选取,因此,当选出最优的一段以后,剩下的子段里依旧面临相同问题并且原问题得到的最优选择也是子问题合并后的最优选择。同样地,本题也具有贪心选择的性质,即每次选到最大的不超过M的一段,就能保证最终得到的子段数量最少(太明显了)
因此,本题做法就可以看成是从头开始依次选最大且不超过M的子段,然后计1,依次往后,计算总和,AC代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int N,M;
while(scanf("%d %d",&N,&M)!=EOF){
int a[N],i,temp=0,num=0;
for(i=0;i<N;i++){
scanf("%d",&a[i]);
}
for(i=0;i<N;i++){
if(a[i]+temp<=M){
temp+=a[i];
}
else{
num++;
temp=a[i];
}
}
if(temp<=M)
num++;
printf("%d\n",num);
}
return 0;
}