luogu P2383 狗哥玩木棒

来源:互联网 发布:python def peven (n) 编辑:程序博客网 时间:2024/05/22 14:53

题目背景

狗哥又趁着语文课干些无聊的事了…

题目描述

现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢?

输入格式:
输入文件中的第一行是一个整数n表示测试的组数,接下来n行表示每组的测试数据。 每行的第一个数为m(4<=m<=20),接下来m个数ai(1<=ai<=1000)表示木棒的长度。

输出格式:
对于每组测试数据,如果可以组成正方形输出“yes”,否则输出“no”。

说明
狗哥快抓狂了


普通搜索+略微剪枝

#include <cstdio>#include <cstring>#include <string>#include <iostream>#include <algorithm>using namespace std;int n,t,sum,f,cnt;//木棍数,询问次数,总长度,标记是否达成条件,当前边的长度int len[25],che[25];//长度数组,标记是否被用过void dfs(int e,int num,int cnt){//dfs    if(num==4){//如果达成就标记f=1并输出        f=1;        cout<<"yes"<<endl;        return;    }    for(int i=1;i<=n;i++){//遍历每条木棍        if(!che[i]&&cnt+len[i]<=e){//如果未用过且不超出目标边长            che[i]=1;//标记为用过            if(cnt+len[i]==e) dfs(e,num+1,0);//如果当前边长正好达成,搜下一边,边长贵0            else dfs(e,num,cnt+len[i]);//继续搜此边            che[i]=0;//还原            if(f==1) return;//玄学退出函数,加速        }    }    return;}int main(){    memset(len,0,sizeof(len));    memset(che,0,sizeof(che));    cin>>t;//读入询问次数    while(t--){        cin>>n;//当前询问的木棍数        for(int i=1;i<=n;i++){            cin>>len[i];//读入长度            sum+=len[i];//求木棍总长        }        sort(len+1,len+n+1);//排序        if(len[n]>sum/4||sum%4!=0){//剪枝,如果最长边已超过目标边长||总长度不能被4整除就不必再搜            cout<<"no"<<endl;            sum=0;            memset(len,0,sizeof(len));//清空是个好习惯            continue;        }        dfs(sum/4,0,0);//目标边长,边数,当前边长度        if(!f) cout<<"no"<<endl;//无法达成        f=0;        sum=0;//清空        memset(len,0,sizeof(len));    }     return 0;}

ps1:写代码一定要认真,不然会两个小时一道水题
ps2:题目名字取得很好(逃

原创粉丝点击