首页 > 其他 > 详细

P1120 小木棍

时间:2019-09-10 20:56:29      阅读:87      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 


因为开学好长时间没有做题,也是把自己写了好久的题补上

从看题解写到将自己的代码改对真的累

主要的优化就是nxt,二分,sort三个,以及及时的退出


#include <bits/stdc++.h>
using namespace std;
int num[70],n,a,flg[70],sum,tag,ma,cnt,nxt[70];
int cmp(int a,int b){return a>b;}
void dfs(int now, int tnt,int last) {
    if(tag)return;
       int l=last,r=n,ans;
    while(l<=r){
        int mid=(l+r)>>1;
        if(num[mid]<=now) {r=mid-1;ans=mid;    }
        else l=mid+1;
    }
    for (int i =ans;i<=n;i++)
        if (!flg[i]) {
            if (num[i]<now) {
                flg[i]=1;cnt++;
                dfs(now-num[i],tnt,i+1);
                flg[i]=0;cnt--;
                if(now==num[i]||now==tnt)return;i=nxt[i];
            }
            if (num[i]==now) {
                flg[i]=1;cnt++;
                if (cnt==n)tag=1;
                else dfs(tnt, tnt,1);
                flg[i]=0;cnt--;
                return;
            }    
        }
}
int main() {
    cin>>n;
    int tot=0;
    for (int i=1;i<=n;i++) {
        cin>>a;
        if(a<=50){num[++tot]=a;sum+=a;}
    }
    n=tot;
    sort(num+1,num+1+n,cmp);
    nxt[n]=n;
    for(int i=n-1;i>0;i--){
        if(num[i]==num[i+1])nxt[i]=nxt[i+1];
        else nxt[i]=i;
    }
    for (int i=num[1];i<=sum/2;i++)
        if (sum%i==0) {
            tag=0;cnt=0;
            memset(flg, 0, sizeof(flg));
            dfs(i,i,1);
            if(tag){cout<<i;return 0;}
        }
        cout<<sum;
}

 

P1120 小木棍

原文:https://www.cnblogs.com/SFWR-YOU/p/11502495.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!