bjfu1042 拼正方形

    xiaoxiao2026-04-10  5

    拼正方形

    时间限制(C/C++):1000MS/3000MS          运行内存限制:65536KByte 总提交:126            测试通过:41

    描述

    给你一些木棍,让你用这些木棍在地上摆出一个正方形的轮廓。如果能摆成,输出"yes",否则输出"no"。

    输入

    第一行有一个正整数t表示数据组数 每组数据占一行,一行中第一个数n(4<=n<=20)表示木棍的根数,接下来的n个数字表示每个木棍的长度。

    输出

    如果能摆成正方形,输出"yes",否则输出"no"。

    样例输入

    3 4 1 1 1 1 5 10 20 30 40 50 8 1 7 2 6 4 4 3 5

    样例输出

    yes no yes

    题目来源

    jhf

    题目知识点:dfs

    AC代码:

    #include<iostream> #include<algorithm> using namespace std; const int MAXN=21; int a[MAXN]; bool vis[MAXN]; int N,ave,curlen,sum; bool cmp(const int &a, const int &b){ return a>b; } bool dfs(int step,int num){ if(num>3) return true; if(step>=N) return false; if(!vis[step]&&(a[step]+curlen)<=ave*num){ vis[step]=true; curlen+=a[step]; if(curlen==ave*num){ if(dfs(0,num+1)) return true; } else if(dfs(step+1,num)) return true; vis[step]=false; curlen-=a[step]; } return dfs(step+1,num); } bool judge(){ if(N<4||sum%4!=0) return false; ave=sum/4; for(int i=0;i<N;i++) if(a[i]>ave) return false; sort(a,a+N,cmp); memset(vis,false,sizeof(vis)); curlen=0; return dfs(0,1); } int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d",&N); sum=0; for(int i=0;i<N;i++){ scanf("%d",&a[i]); sum+=a[i]; } if(judge()) cout<<"yes\n"; else cout<<"no\n"; } system("pause"); return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-1308681.html
    最新回复(0)