社区讨论

50分求调

P4799[CEOI 2015] 世界冰球锦标赛 (Day2)参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mm4oe74v
此快照首次捕获于
2026/02/27 17:14
2 周前
此快照最后确认于
2026/03/01 13:30
上周
查看原帖
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,x;
ll a[45];
ll mp[1148576];
vector<int> b;
ll ans=0;
ll len=0;
ll find(ll nums)
{
    int l=0,r=len-1;
    int pos=-1;
    while(l<=r)
    {
        int mid=l+(r-l)/2;
        if(mp[mid]<=nums)
        {
            pos=mid;
            l=mid+1;
        }
        else
        {
            r=mid-1;
        }
    }
    return pos+1;
}
int main()
{
	cin>>n>>x;
	
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=n/2;i<n;i++)
	{
		b.push_back(a[i]);
	}
	int m=b.size();
  	for (int i = 0; i < (1 << m); i++)
	{
    	ll sum = 0;
    	for (int j = 0; j < m; j++) 
		{
      		if ((i >> j) &  1) sum += b[j];
    	}
    	if(sum>x)
    	{
			continue;
		}
    	mp[len++]=sum;
  	}
  	sort(mp,mp+len);
	for (int i = 0; i < (1 << (n/2)); i++) 
	{
	    ll sum = 0;
	    for (int j = 0; j < n/2; j++) {
	      if ((i >> j)&1) sum += a[j];
	    }
		if(sum<=x)
		{
			int s=find(x-sum);
			ans+=s;
		}
	}
	cout<<ans;
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...