TLE50tps求卡常(玄关
查看原帖
TLE50tps求卡常(玄关
1539207
__LZQ__楼主2025/7/25 15:42
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
#include<cstring>
typedef long long lo;
const int N=20;
lo m,n,a[N],minn[N],space[1<<N],f[1<<N];
std::vector<lo>res;
lo min(lo x,lo y){return x>y?y:x;}
lo max(lo x,lo y){return x>y?x:y;}
lo dfs(lo S)
{
    if(!S)return minn[n];
    if(f[S]!=0)return f[S];
    lo x=__builtin_ctzll(S),s=S^(1<<x);
    for(lo T=s;;T=(T-1)&s){f[S]=max(f[S],dfs(T)+dfs(s^T)+a[x+1]);if(!T)break;}
    f[S]=min(f[S],minn[x]);
    if(space[S]>=minn[x])f[S]=-1e18;
    return f[S];
}
char ch;
inline void read(lo&x)
{
    while((ch=getchar())<48||ch>57);
    x=ch^48;
    while((ch=getchar())<58&&ch>47)x=(x<<1)+(x<<3)+(ch^48);
}
inline void write(const lo&x)
{
    if(x>9)write(x/10);
    putchar(x%10+48);
}
int main()
{
    read(m);read(n);
    for(int i=1;i<=n;++i)read(a[i]);
    for(lo S=0;S<(1<<n);++S)
    {
        minn[0]=m+1;
        for(int i=1;i<=n;++i)
        {
            minn[i]=minn[i-1];
            if(!((S>>(i-1))&1))minn[i]=min(minn[i],a[i]);
        }
        if(S)space[S]=space[S^(S&(-S))]+a[__builtin_ctzll(S)+1];
        memset(f,0,sizeof(f));
        if(dfs(S)>m)res.push_back(space[S]);
    }
    sort(res.begin(),res.end());
    unique(res.begin(),res.end());
    write(res.size());putchar('\n');
    for(lo sp:res)write(sp),putchar(' ');
}

rt

也可能是写得有问题 但调不出来了(

2025/7/25 15:42
加载中...