题解:P12733 磨合
思路
先考虑贪心,对其进行排序。然后对其进行前缀和,然后再使用二分来查找答案。
设排完序后的难度数组为
:::info[可行性说明]
为什么可行?以样例 1 为例,排序后求前缀和
:::warning{open} 十年 OI 一场空,不开 long long 见祖宗。 :::
solution
#include<bits/stdc++.h>
#define ll long long
#define For(i,a,b) for(int i = a;i<=b;i++)
using namespace std;
inline __int128 read(){__int128 x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-'){f=-1;}c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return f*x;}
inline void write(__int128 x){if(x<0){putchar('-');x=-x;}if(x>9)write(x/10);putchar(x%10+'0');}
ll a[1000005];
int main(){
int n = read(),q = read();
For(i,1,n) a[i] = read();
sort(a+1,a+n+1);
For(i,1,n) a[i]+=a[i-1];
For(i,1,n) a[i]+=a[i-1];//两次前缀和
while(q--){
ll t = read();
write(upper_bound(a+1,a+n+1,t)-a-1);//二分找到在t时间内最多能做多少题
putchar('\n');
}
return 0;
}