求卡常
  • 板块P1120 小木棍
  • 楼主jqQt0220
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/17 12:52
  • 上次更新2024/7/17 14:28:32
查看原帖
求卡常
678175
jqQt0220楼主2024/7/17 12:52
#include<bits/stdc++.h>
using namespace std;
// #define fileio
#define IOS
void ___()
{
#ifdef fileio
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
#endif
#ifdef IOS
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    #define endl '\n'
#endif
}
#define ll long long
const int _mxn=65+5;
int n,a[_mxn];
int len,cnt;
bool vis[_mxn];
bool dfs(int dep,int l,int t)
{
    if(dep>cnt)
        return true;
    if(l==len)
        return dfs(dep+1,0,1);
    int f=0;
    for(int i=t;i<=n;i++)
    {
        if(!vis[i]&&l+a[i]<=len&&f!=a[i])
        {
            vis[i]=true;
            if(dfs(dep,l+a[i],i+1))
                return true;
            f=a[i];
            vis[i]=false;
            if(l==0||l+a[i]==len)
                return false;
        }
    }
    return false;
}
int main()
{
    ___();
    cin>>n;
    int mx=0,s=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]>50)
        {
            n--,i--;
            continue;
        }
        mx=max(mx,a[i]),s+=a[i];
    }
    sort(a+1,a+n+1,greater<int>());
    for(len=mx;len<=s;len++)
    {
        if(s%len)
            continue;
        cnt=s/len;
        if(dfs(1,0,1))
        {
            cout<<len<<endl;
            break;
        }
    }
    return 0;
}

最后一个点差 2ms,剪枝能加的基本上都加了,O2 也开了

2024/7/17 12:52
加载中...