"肥宅大哭.jpg VJ补题

"肥宅大哭.jpg

众所周知,"肥宅大哭.jpg"是一只很强劲的队伍,在去年的比赛中取得了优秀的成绩。于是懋神心不甘情不愿的去找他们队请教比赛技巧。他们队里一共有三位成员,龙龙,喵喵和特别强的zhb。因为zhb特别强,可以一眼看出每个题目的难度。喵神对龙龙特别了解,可以一眼看出写每道题的用时。而龙龙作为主代码手,获取zhb和喵喵的信息以后,决定按照难度递增顺序做题。现在比赛一共有N道题,比赛时长为M分钟,对于第i道题,每道题的难度是Di,龙龙花费的时间为Ti
,现在你想知道,这场比赛他们队一共能做出来多少题。
Input
输入数据包括多组用例,第一行为数字T(1≤T≤20),表示用例组数。

对于每一组数据,第一行包括两个数N,M(1≤N,M≤105)
,含义如题面描述所示。下一行包括N个互不相同的整数D1,D2,⋯,Dn(1≤Di≤105),表示zhb认为的题目难度。

接下来一行包括N个整数T1,T2,⋯,TN(1≤Ti≤105),表示喵喵认为龙龙需要做此题的用时。

Output
对于每组用例,在一行内输出"Case x: y"(不含引号),其中x表示数据编号,y
表示该组数据答案。

Example

Input
2
5 120
5 10 20 35 100
10 20 35 100 100000
13 300
52 55 82 11 62 79 38 8 58 28 1 70 32
27 62 45 77 22 69 34 43 21 43 85 22 36

Output
Case 1: 3
Case 2: 5

#include "iostream"
#include "cstdio"
#include "algorithm"
using namespace std;
int a[100005];
int check(int mid , int n, int m)
{
    int i, k, j;
    int sum = 0;
    int ans = 0;
    for(i =1; i <= n; i++)
    {
        if(sum + a[i] <= mid)
            sum += a[i];
        else
        {
            sum = a[i];
            sum++;
        }
    }
    ans++;
    if(ans <= m)
        return 1;
    else
        return 0;
}

int main()
{
    int n ,m ,i, j, k;
    scanf("%d %d",&n,&m);
    for(i = 1; i <= n; i++)
    {
        scanf("%d",&a[i]);
        
    }
    int ans = 1, l = 1, r = 1e9;
    while(l <= r)
    {
        int mid = (l + r) / 2;
        if(check(mid, n, m))
        {
            r = mid - 1;
            ans = mid;
        }
        else
            l = mid + 1;
    }
    printf("%d\n",ans);
    return 0;
}

你可能感兴趣的:(基本操作)