zoukankan      html  css  js  c++  java
  • 贪心

    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;
    }

  • 相关阅读:
    MySQL 存储过程 (2)
    MySQL 存储过程
    MySQL 数据库常用命令
    oracle 控制文件多路复用
    oracle定时清理日志操作
    git 常用的分支技巧
    golang tcp keepalive实践
    TCP keepalive的详解(解惑)
    勾践为什么卧薪尝胆
    golang context学习记录1
  • 原文地址:https://www.cnblogs.com/dll6/p/5783056.html
Copyright © 2011-2022 走看看