zoukankan      html  css  js  c++  java
  • hdu 5937

    题意:给出1-9的个数,然后组成a+b=c的式子(1<=a,b,c<=9),这样的式子有多少个?

    算一下,有36个,满36个需要用到的ai的个数是17-i,先判满不满,num[i]=min(num[i],17-i),多于限制个没什么用,然后真的只要爆搜就行了,不敢相信自己的眼睛

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=500;
    int a[10],ans;
    int d[36][3];
    
    map<int,int> vis;
    void init(){
        int cnt=0;
        for(int i=1;i<9;i++)
        for(int j=1;j+i<10;j++){
            d[cnt][0]=i;
            d[cnt][1]=j;
            d[cnt][2]=i+j;
            vis[i]++;vis[j]++;vis[i+j]++;
            cnt++;
        }
        //printf("%d
    ",cnt);
        //for(int i=1;i<=9;i++)cout<<i<<" "<<vis[i]<<endl;
    }
    
    inline bool judge(int p){
        if(a[d[p][0]]>=0&&a[d[p][1]]>=0&&a[d[p][2]]>=0)return true;
        return false;
    }
    
    inline void ss(int p,int val){
        a[d[p][0]]+=val;a[d[p][1]]+=val;a[d[p][2]]+=val;
    }
    
    void dfs(int dep,int now,int sz){
        if(36-dep+now<=ans||dep>=36)return ;
        ss(dep,-1);
        if(judge(dep)){
            ans=max(ans,now+1);
            dfs(dep+1,now+1,sz-3);
        }
        ss(dep,1);
        dfs(dep+1,now,sz);
    }
    
    int main(){
        init();
        int t,cas=1,cnt;
        scanf("%d",&t);
        while(t--){
            cnt=0;bool ok=1;
            for(int i=1;i<=9;i++){
                scanf("%d",a+i);
                a[i]=min(a[i],17-i);
                if(a[i]<17-i)ok=0;
                cnt+=a[i];
            }
            if(ok)ans=36;
            else{
                ans=0;
                dfs(0,0,cnt);
            }
            printf("Case #%d: %d
    ",cas++,ans);
        }
        return 0;
    }
    
  • 相关阅读:
    数据结构之队列
    数据结构之循环链表-c语言实现
    数据结构之栈-c语言实现
    数据结构之栈
    vue v-model原理实现
    vue中使用mixins
    async和await
    vue组件中使用watch响应数据
    vue组件中使用<transition></transition>标签过渡动画
    react-motion 动画案例介绍
  • 原文地址:https://www.cnblogs.com/jihe/p/6024135.html
Copyright © 2011-2022 走看看