POJ 1011 / UVA 307 Sticks

本文通过一个具体的中文题目,深入探讨了使用深度优先搜索(DFS)算法解决复杂问题的过程。作者详细记录了从初遇到问题到最后解决所经历的种种挑战,包括TLE与WA等问题,并分享了在不同平台上的调试经验及最终解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中文题 (一般都比较坑)

思路:DFS
这里写图片描述
(感谢学长的幻灯片)

这破题把我折腾惨了!!!搞了n天

// by Sirius_Ren
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,a[100],sum,jy,maxx,q;
bool vis[100];
bool cmp(int a,int b){return a>b;}
bool dfs(int x,int l,int pos){
    if(x==q)return 1;
    for(int i=pos+1;i<=n;i++){
        if(vis[i]||(!vis[i-1]&&a[i]==a[i-1]&&i>1))continue;
        if(l==a[i]){
            vis[i]=1;
            if(dfs(x+1,jy,0))return 1;
            vis[i]=0;return 0;
        }
        if(l>a[i]){
                vis[i]=1;
                if(dfs(x,l-a[i],i))return 1;
                vis[i]=0;
                if(l==jy)return 0;
            }
        }
    return 0;
}   
int main()
{
    while(scanf("%d",&n)&&n){
        maxx=sum=0;
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++)scanf("%d",&a[i]),sum+=a[i],maxx=max(maxx,a[i]);
        sort(a+1,a+1+n,cmp);
        for(jy=maxx;jy<=sum;jy++){
            if(sum%jy)continue;
            q=sum/jy;
            memset(vis,0,sizeof(vis));
            if(dfs(0,jy,0)){printf("%d\n",jy);break;}
        }
    }
}

惨痛的失败经历。。。
TLE了一屏半

这里写图片描述

WA了半屏

这里写图片描述

在mars_ch&玉环的帮助下终于A了此题。。。

这里写图片描述

去UVA上交了一遍 1A

这里写图片描述

还挺快 嘿嘿

这里写图片描述

mars_ch争论了很久是if(dfs(x,l-a[i],i))return 1;还是if(dfs(x,l-a[i],pos+1))return 1;
在POJ上都是16msAC的 她表示没有什么区别


UVA 证明了一切
她的程序got TLE 哈哈哈哈 (青出于蓝而胜于蓝)
这里写图片描述

转载于:https://www.cnblogs.com/SiriusRen/p/6532458.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值