数列分段`Section II`(洛谷-P1182)
生活随笔
收集整理的這篇文章主要介紹了
数列分段`Section II`(洛谷-P1182)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
對于給定的一個長度為N的正整數數列?A?i?,現要將其分成?M(M≤N)?段,并要求每段連續,且每段和的最大值最小。
關于最大值最小:
例如一數列?4 2 4 5 1 要分成?3?段
將其如下分段:
[4 2][4 5][1]
第一段和為?6?,第?2?段和為?9?,第?3?段和為?1?,和最大值為?9?。
將其如下分段:
[4][2 4][5 1]
第一段和為?4?,第?2?段和為?6?,第?3?段和為?6?,和最大值為?6?。
并且無論如何分段,最大值不會小于?6?。
所以可以得到要將數列?4 2 4 5 1?要分成?3?段,每段和的最大值最小為?6?。
輸入輸出格式
輸入格式:
第?1?行包含兩個正整數N,M。
第?2?行包含?N?個空格隔開的非負整數?Ai??,含義如題目所述。
輸出格式:
一個正整數,即每段和最大值最小為多少。
輸入輸出樣例
輸入樣例#1:
5 3
4 2 4 5 1
輸出樣例#1:
6
源代碼
#include<iostream> #include<algorithm> using namespace std; int n,m,a[1000000]; bool judge(int x) {int sum=0,group=1;//組數和清零,組數歸1for(int i=1;i<=n;i++){sum+=a[i];//累加和if(sum>x)//當前和>當前值{sum=a[i];//和=當前值group++;//分組}}if(group<=m)//當前組數<需要組數return true;//需要減小右值elsereturn false; } int main() {int l=0,r=0,mid;int i;cin>>n>>m;for(i=1;i<=n;i++){cin>>a[i];l=max(l,a[i]);//設置左值為數列最大值r+=a[i];//設置右值為數列和}while(l+1<r){mid=(l+r)/2;//取中間值if(judge(mid))//進行判斷r=mid;else l=mid;}if(judge(l))//判斷當前值是否滿足條件cout<<l<<endl;elsecout<<r<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的数列分段`Section II`(洛谷-P1182)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 石子合并(洛谷-P1880)
- 下一篇: 烹调方案(洛谷-P1417)