• C++-POJ1020-Anniversary Cake[搜索][dfs]


     1 #include <set>
     2 #include <map>
     3 #include <cmath>
     4 #include <queue>
     5 #include <vector>
     6 #include <cstdio>
     7 #include <cstdlib>
     8 #include <cstring>
     9 #include <iostream>
    10 #include <algorithm>
    11 using namespace std;
    12 int t,s,n,a,sum,row[41],cake[17];
    13 void init(){memset(row,0,sizeof(row)),memset(cake,0,sizeof(cake)),sum=0;}
    14 int find(){int p;for(int i=1,min=41;i<=s;i++)if(min>row[i])min=row[i],p=i;return p;}
    15 int count(int p){int cnt=0;for(int i=p;i<=s;i++)if(row[i]==row[p])cnt++;else break;return cnt;}
    16 void put(int p,int x){cake[x]--;for(int i=p;i<=p+x-1;i++)row[i]+=x;}
    17 void del(int p,int x){cake[x]++;for(int i=p;i<=p+x-1;i++)row[i]-=x;}
    18 bool dfs(int dep) {
    19     if(dep==n)return true;int p=find();
    20     for(int x=10;x;x--)if(cake[x]&&row[p]+x<=s&&count(p)>=x){put(p,x);if(dfs(dep+1))return true;del(p,x);}
    21     return false;
    22 }
    23 int main() {
    24     for (scanf("%d",&t);t--;) {
    25         init(),scanf("%d%d",&s,&n);
    26         for(int i=1;i<=n;i++)scanf("%d",&a),cake[a]++,sum+=a*a;
    27         puts((sum==s*s?dfs(0):0)?"KHOOOOB!":"HUTUTU!");
    28     }
    29     return 0;
    30 }
    ~~Jason_liu O(∩_∩)O
  • 相关阅读:
    BZOJ3129/洛谷P3301方程(SDOI2013)容斥原理+扩展Lucas定理
    Dilworth定理
    字符串
    hash
    李超线段树(segment[HEOI2013]-洛谷T4097)
    连通数[JSOI2010]-洛谷T4306
    主席树
    splay
    树链剖分
    受欢迎的奶牛-洛谷2341
  • 原文地址:https://www.cnblogs.com/JasonCow/p/12312395.html
Copyright © 2020-2023  润新知