您的位置:首页 > 其它

二分答案 POJ3273

2015-08-21 16:02 363 查看
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>

using namespace std;

int n,m;
int arr[100010];
int reans;
int flag;

void dfs(int mi,int ma)
{
if(flag==1)
return ;
if(mi==ma)
{
flag=1;
reans=mi;
return ;
}
int num=1;
int tmp=0;
int ans=(mi+ma)/2;
for(int i=0;i<n;i++)
{
if(tmp+arr[i]<=ans)
{
tmp=tmp+arr[i];
}
else
{
tmp=arr[i];
num++;
}
}
if(num>m)
{
dfs(ans+1,ma);
}
else if(num<=m)
{
dfs(mi,ans);
}
}

int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int ma=0;
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
if(arr[i]>ma)
ma=arr[i];
}
flag=0;
dfs(ma,1000000000);
cout<<reans<<endl;
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: