"肥宅大哭.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;
}