题目
因为然然很可爱,所以他从入学以来每天都会收到ai个礼物,到第n天的时候,然然发现他的宿舍被礼物搞得一团糟,所以然然打算到超市买一个柜子装礼物。但是超市有m个柜子,每个柜子都有不同的容量bi,然然想知道每个柜子最多可以装多少天的礼物(可以不从第一天开始装礼物)。因为然然有强迫症,所以同一天的礼物必须同时装进柜子或者同时不装进柜子(比如第一天收到2个礼物,你不能将它分解成1 + 1个礼物。)
输入格式:
第一行输入两个整数n,m。
第二行输入 n 个整数,表示第 i(1 <= i <= n)天然然收到了 ai 个礼物。
第三行输入 m 个整数,表示第 i(1 <= i <= m)个柜子的容量是 bi。
1 <= n,m <= 1000000(1e6)
1 <= ai <= 1000000000 (1e9)
1 <= bi <= 1000000000000000000 (1e18)
输出格式:
输出m个整数,表示第i(1 <= i <= m)个柜子最多可以装多少天的礼物。
tips:末尾无空格
输入样例:
3 2
1 5 2
2 4
输出样例:
1 2
解题思路
前缀和
先将收到的礼物(a[n])进行排序,对排序后得到的数组进行前缀和的计算
nums[0]=a[0];
for(int i=1;i<n;i++) nums[i]=nums[i-1]+a[i];
得到前缀和后,用输入的柜子容量数组(b[m])一一对比输出当前缀和大于当前柜子容量时的数值;由于题目要求末尾无空格,故当输出不是最后一位时输出空格;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(nums[j]>b[i]){
cout<<j;
break;
}
}
if(i!=m-1) cout<<" ";
}
完整代码
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
long long int n,m;
cin>>n>>m;
int* a=new int [n];
int* b=new int [m];
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<m;i++) cin>>b[i];
sort(a,a+n);
int* nums=new int [n];
nums[0]=a[0];
for(int i=1;i<n;i++) nums[i]=nums[i-1]+a[i];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(nums[j]>b[i]){
cout<<j;
break;
}
}
if(i!=m-1) cout<<" ";
}
cout<<endl;
delete []a;
delete []b;
delete []nums;
return 0;
}