比赛 |
20160420s |
评测结果 |
AAAAAAAAAA |
题目名称 |
买汽水 |
最终得分 |
100 |
用户昵称 |
Satoshi |
运行时间 |
0.255 s |
代码语言 |
C++ |
内存使用 |
12.31 MiB |
提交时间 |
2016-04-20 08:28:46 |
显示代码纯文本
#include <fstream>
#include <algorithm>
#define N (1<<20)+10
using namespace std;
ifstream in("drink.in");
ofstream out("drink.out");
int n,m;int va[30]={0},vb[30]={0};int a[N]={0},topa=0,b[N]={0},topb=0;
void heiheihei(int tot,int pos){if(tot>m)return ;if(pos==n/2+1){a[++topa]=tot;return ;}else{for(int i=0;i<=1;i++){heiheihei(tot+i*va[pos],pos+1);}}}
void piapiapia(int tot,int pos){if(tot>m)return ;if(pos==(n+1)/2+1){b[++topb]=tot;return ;}else{for(int i=0;i<=1;i++){piapiapia(tot+i*vb[pos],pos+1);}}}
void read(){int i;in>>n>>m;for(i=1;i<=n/2;i++)in>>va[i];}
int c[N]={0},top=0;
void init(){heiheihei(0,1);piapiapia(0,1);sort(a+1,a+topa+1);sort(b+1,b+topb+1);int i;for(i=1;i<topa;i++)if(a[i]==a[i+1])a[i]=-1;for(i=1;i<=topa;i++)if(a[i]!=-1)c[++top]=a[i];for(i=1;i<=top;i++)a[i]=c[i];topa=top;top=0;for(i=1;i<topb;i++)if(b[i]==b[i+1])b[i]=-1;for(i=1;i<=topb;i++)if(b[i]!=-1)c[++top]=b[i];for(i=1;i<=top;i++)b[i]=c[i];topb=top;top=0;}
int fuck(int x){int l,r,mid;l=1;r=topb;while(l<r){mid=(l+r)>>1;if(x>b[mid])l=mid+1;else r=mid;}if(b[l]<=x)return b[l];return b[l-1];}
int ans=0;void work(){int i,del;for(i=1;i<=topa;i++){del=fuck(m-a[i]);ans=max(ans,a[i]+del);}out<<ans<<endl;}
void print(){int i;for(i=1;i<=topa;i++)out<<a[i]<<' ';out<<endl;for(i=1;i<=topb;i++)out<<b[i]<<' ';out<<endl;}
int main()
{
read();
for(int i=1;i<=(n+1)/2;i++)in>>vb[i];
init();
work();
return 0;
}