求助!39分

P4799 [CEOI2015 Day2] 世界冰球锦标赛

plafle @ 2019-04-01 15:24:22

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,m,a[1005],lsol[(1 << 20)+5]={0},sum=0,lx=0,rx=0,rsol[(1 << 20)+5]={0},l,r,mid,maxx;

void dfs(int c,int ed,int x) {
    if (x>m)
      return;
    if (c==ed+1) {
        if (ed==(n >> 1))
          lsol[++lx]=x; else
          rsol[++rx]=x;
        return;
    }
    dfs(c+1,ed,x);
    dfs(c+1,ed,x+a[c]);
}

long long find(int x) {
  l=1;
  r=rx;
  maxx=0;
  while (l<=r) {
      mid=(l+r) >> 1;
      if (x+rsol[mid]<=m) {
          maxx=max(maxx,mid);
          l=mid+1;
      } else
        r=mid-1;
  }    
  return maxx;
}
int main() {
    scanf("%lld%lld",&n,&m);
    for (int i=1; i<=n; i++)
      scanf("%lld",&a[i]);
    dfs(1,n >> 1,0);
    dfs((n >> 1)+1,n,0);
    sort(rsol+1,rsol+rx+1);
    for (int i=1; i<=lx; i++) 
        sum+=find(lsol[i]);
    printf("%lld",sum);
    return 0;
}

by plafle @ 2019-04-01 15:27:52

各位,我把dfs的参数后来改成longlong了 但是还是78分

不知道为什么


|