首页 > 其他分享 >小木棍

小木棍

时间:2023-04-29 09:34:15浏览次数:29  
标签:return int dep flag 木棍 now

题目传送门

这题有四个剪枝:

  1. 优化搜索顺序,将木棍长按照从大到小排序
  2. 枚举木棍时保证编号递增。
  3. 剪掉冗余搜索状态,同一组内的重复元素直接跳过
  4. 如果这根木棍是这一组的第一根或最后一根,搜索完直接返回。
    然后洛谷上的最后一个数据点很恶心,需要卡常。
#include<bits/stdc++.h>
using namespace std;
#define L(i,l,r) for(int i=l;i<=r;++i)
#define R(i,l,r) for(int i=r;i>=l;--i)
const int N=70;
int n,a[N],len,sum,tot;
bool flag,st[N];
void dfs(int dep,int now,int lst){
    if(flag)return;
    if(now==len){dfs(dep+1,0,1);return;}
    if(dep==tot){
        flag=1;
        return;
    }
    int last=-1;
    L(i, lst, n){
        if(st[i]||a[i]==last)continue;
        last=a[i];
        if(now+a[i]<=len){
            st[i]=1;
            dfs(dep,now+a[i],i+1);
            st[i]=0;
            if(!now||now+a[i]==len)return;
        }
    }
}
int main(){
    // freopen("1.in","r",stdin);
    // freopen("1.out","w",stdout);
    // ios::sync_with_stdio(0);
    // cin.tie(0);
    // cout.tie(0);
    scanf("%d",&n);
        memset(st,0,sizeof st);
        flag=len=sum=0;
        L(i, 1, n)scanf("%d",a+i),len=max(len,a[i]),sum+=a[i];
        sort(a+1,a+1+n,greater<int>());
        // cout<<len<<' '<<sum/2<<endl;
        L(i, len, sum/2)
            if(sum%i==0){
                // printf("%d\n",i);
                len=i;
                tot=sum/i;
                dfs(1,0,1);
                if(flag){
                    printf("%d\n",i);
                    break;
                }
            }
        if(!flag)printf("%d\n",sum);
    
    return 0;
}

标签:return,int,dep,flag,木棍,now
From: https://www.cnblogs.com/wscqwq/p/17363579.html

相关文章

  • 关于“木棍分割”的反思
    [HAOI2008]木棍分割题目描述有n根木棍,第i根木棍的长度为Li,n根木棍依次连结了一起,总共有n-1个连接处.现在允许你最多砍断m个连接处,砍完后n根木棍被分成了很多段,......
  • 洛谷 P1233 木棍加工(贪心,递增子串DP)
    题目大意:有矩形A1,A2......An.每个矩形有长宽w,h。现在已知cost:(1)若矩形a的w,h小于矩形b的w,h,那么没有cost(2)其它情况cost+1.现在已知矩形A1,A2...,问怎么得到最少cost.解题思......
  • 四根长度为3、两根长度为4、四根长度为7的木棍能围成多少种不同的矩形
    四根长度为3、两根长度为4、四根长度为7的木棍能围成多少种不同的矩形问题四根长度为3、两根长度为4、四根长度为7的木棍能围成多少种不同的矩形。无需每次用完所有木棍......
  • csp-s模拟19[木棍,环,传令,序列]
    csp-s模拟19[木棍,环,传令,序列]木棍就是个分讨,注意先\(3,4\)配就行here#include<bits/stdc++.h>#defineLLlonglong#defineReregisterint#defineLDdo......
  • NC50243 小木棍
    题目原题地址:小木棍题目编号:NC50243题目类型:搜索剪枝、BFS时间限制:C/C++1秒,其他语言2秒空间限制:C/C++32768K,其他语言65536K1.题目大意n根木棍,由k根长度为l且相......
  • acwing3667. 切木棍
    acwing3667.切木棍题目链接:https://www.acwing.com/problem/content/description/3670/思路n如果是奇数,肯定无解n如果是偶数,就去看n/2可以怎么分为两份(1与n/2-1...........