2 条题解
-
1
#include<bits/stdc++.h> using namespace std; #define int long long const int N=2e5+10; int r[N]; signed main() { int n,q;scanf("%lld%lld",&n,&q); for(int i=1;i<=n;i++)scanf("%lld",&r[i]); sort(r+1,r+n+1); for(int i=1;i<=n;i++)r[i]+=r[i-1]; while(q--) { int x;scanf("%lld",&x); int id=lower_bound(r+1,r+n+1,x)-r-1; if(r[id+1]==x)id++; printf("%lld\n",id); } return 0; } -
0
注意暴力O(nq)会超时
#include<bits/stdc++.h> using namespace std; #define ll long long ll n,q,a[200010],x,s[200010]; int main() { scanf("%lld%lld",&n,&q); memset(s,0,sizeof s); for(ll i=1;i<=n;i++)scanf("%lld",&a[i]); sort(a+1,a+n+1); for(ll i=1;i<=n;i++)s[i]=s[i-1]+a[i];//前缀和 while(q--) { scanf("%lld",&x); if(x>=s[n]){printf("%lld\n",n);continue;} if(x<s[1]){puts("0");continue;}//临界状态 ll id=upper_bound(s+1,s+n+1,x)-s-1; //直接在前缀和中查找能拉多少 printf("%lld\n",id); } return 0; }
- 1
信息
- ID
- 8272
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 5
- 标签
- 递交数
- 31
- 已通过
- 14
- 上传者