比赛 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;
}