2 条题解

  • 1
    @ 2026-2-2 10:07:04
    #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
      @ 2026-2-2 10:44:28

      注意暴力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
      上传者