贪心

1921: B

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 209  Solved: 14

SubmitStatusWeb Board

Description

给定一个长度为n的数字序列a,从中选取一个长为m的子序列b满足 b[i]&b[i-1]!=0 (2<=i<=m)
求最大的m。

Input

第一行输入一个整数t,代表有t组测试数据。
每组数据第一行输入一个整数n代表a序列的长度,接下来一行输入n个正整数表示ai(0<i<=n)。
1<=t<=20,0<=n<=100000,0<=ai<=1e9。

Output

一个整数表示最大的m。

Sample Input

1 3 1 1 1

Sample Output

3

HINT

 

Source

 
 
代码:
 

#include<iostream>
using namespace std;
const int MAX=100;
int a[MAX];
int n,m;

bool Judge(int x)
{
int s=0,cnt=0;
for(int i=0;i<n;i++)
{
if(x<a[i])
return false;
if(s+a[i]<=x)
s+=a[i];
else
{
s=a[i];
cnt++;
if(cnt>m-1)
return false;
}
}
return true;
}

int Solve(int lo,int hi)
{
int mid;
while(lo<hi)
{
mid=lo+(hi-lo)/2;
if(Judge(mid))
hi=mid;
else
lo=mid+1;
}
return lo;
}

int main()
{
int max,sum,T;
cin>>T;
while(T--)
{
cin>>n>>m;
if(m>n)
m=n;
max=0;
sum=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(max<a[i])
max=a[i];
sum+=a[i];
}
cout<<Solve(max,sum)<<endl;
}
return 0;
}

posted on 2016-08-18 10:31  缄默。  阅读(124)  评论(0编辑  收藏  举报

导航