• P2383 狗哥玩木棒


    题目背景

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

    题目描述

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

    输入输出格式

    输入格式:

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

    输出格式:

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

    输入输出样例

    输入样例#1:
    3
    4 1 1 1 1 
    5 10 20 30 40 50 
    8 1 7 2 6 4 4 3 5
    输出样例#1:
    yes
    no
    yes

    说明

    狗哥快抓狂了

    题目大意:t组测试 n个木棒 是否能拼成一个正方形

    题解:

    dfs.

    a、因为木棒都要用完,所以木棒的长度和%4!=0 直接输出No

    b、最长的木棒大于求出的正方形的边 输出no (sum/4)

    代码:

    洛谷上面一个代码很好...我加了b的判断

    我写的略丑..=L=

    搜索用完n个木棒。

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    int t,n,sum,flag,maxx,w[5],a[22];
    void dfs(int q){
        if(q==n+1){flag=1;return;}
        if(flag)return;
        for(int i=1;i<=4;i++){
            if(w[i]>=a[q]){
                w[i]-=a[q];
                dfs(q+1);
                w[i]+=a[q];
            }
        }
    }
    int main(){
        scanf("%d",&t);
        while(t--){
            sum=0;flag=0;maxx=-0x7ffffff;
            scanf("%d",&n);
            for(int i=1;i<=n;i++){
                scanf("%d",&a[i]);
                sum+=a[i];maxx=max(maxx,a[i]);
            }
            if(sum%4){
                printf("no
    ");
                continue;
            }
            if(maxx>sum/4){
                printf("no
    ");
                continue;
            }
            for(int i=1;i<=4;i++)
            w[i]=sum/4;
            sort(a+1,a+n+1,greater<int>());
            dfs(1);
            if(flag)printf("yes
    ");
            else printf("no
    ");
        }
        return 0;
    }

    换个风格

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int t,n,a[22],flag,sum,maxx,vis[22];
    void dfs(int l,int v){
        if(v==3&&l==sum){flag=1;return;}
        if(flag)return;
        if(l==sum)l=0,v+=1;
        for(int i=1;i<=n;i++){
            if(!vis[i]&&l+a[i]<=sum){
                vis[i]=1;
                dfs(l+a[i],v);
                vis[i]=0;
            }
        }
    }
    int main(){
        scanf("%d",&t);
        while(t--){
            flag=0;sum=0;maxx=-0x7ffff;
            scanf("%d",&n);
            maxx=-0x7ffffff;sum=0;
            for(int i=1;i<=n;i++){scanf("%d",&a[i]);sum+=a[i];maxx=max(maxx,a[i]);}
            if(sum%4||maxx>sum/4){printf("no
    ");continue;}
            sum/=4;
            sort(a+1,a+n+1,greater<int>());
            dfs(0,0);
            if(flag)printf("yes
    ");
            else printf("no
    ");
        }
        return 0;
    }
  • 相关阅读:
    TC字符界面菜单程序【原创】
    图片定时自动播放
    根据登录的不同权限,登录不同的窗口!
    html布局
    sprig 的基本使用方法和运用领域
    hibernate的链接数据库的基本步骤
    Jquery
    Java链接数据库的基本步骤
    ajax
    SQL索引的初步使用
  • 原文地址:https://www.cnblogs.com/zzyh/p/7470659.html
Copyright © 2020-2023  润新知