zoukankan      html  css  js  c++  java
  • P1120-小木棍 [数据加强版]

    吸口氧气才能过

     1 #include <bits/stdc++.h>
     2 #define _for(i,a,b) for(int i = (a);i < b;i ++)
     3 #define _rep(i,a,b) for(int i = (a);i > b;i --)
     4 #define INF 0x3f3f3f3f
     5 typedef long long ll;
     6 using namespace std;
     7 inline ll read()
     8 {
     9     ll ans = 0;
    10     char ch = getchar(), last = ' ';
    11     while(!isdigit(ch)) last = ch, ch = getchar();
    12     while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
    13     if(last == '-') ans = -ans;
    14     return ans;
    15 }
    16 inline void write(ll x)
    17 {
    18     if(x < 0) x = -x, putchar('-');
    19     if(x >= 10) write(x / 10);
    20     putchar(x % 10 + '0');
    21 }
    22 int N;
    23 int a[66],Next[66],vis[66];
    24 int aend = 0;
    25 int sum = 0;
    26 int num;
    27 bool dfs(int k,int la,int re)
    28 {
    29     if(!re)
    30     {
    31         if(k==num) return true;
    32 
    33         _for(i,1,aend+1)
    34         if(!vis[i])
    35         {
    36             vis[i] = 1;
    37             if(dfs(k+1,i,(sum/num)-a[i])) return true;
    38             else
    39             {
    40                 vis[i] = 0;
    41                 return false;
    42             }
    43         }
    44         return false;
    45     }
    46 
    47     int t = lower_bound(a+la,a+aend+1,re,greater<int>())-a;
    48     _for(i,t,aend+1)
    49         if(!vis[i])
    50         {
    51             vis[i] = 1;
    52             if(dfs(k,i,re-a[i])) return true;
    53             vis[i] = 0;
    54 
    55             if(re==a[i] || re==sum/num)    return false;
    56             i = Next[i];
    57             if(i==aend) return false;
    58         }
    59     return false;
    60 }
    61 int main()
    62 {
    63     N = read();
    64     int t;
    65     _for(i,1,N+1)
    66     {
    67         t = read();
    68         if(t>50)
    69             continue;
    70         a[++aend] = t;
    71         sum += a[aend];
    72     }
    73     sort(a+1,a+aend+1,greater<int>());
    74 
    75     Next[aend] = aend;
    76     _rep(i,aend-1,0)
    77     {
    78         if(a[i]==a[i+1]) Next[i] = Next[i+1];
    79         else Next[i] = i;
    80     }
    81 
    82     memset(vis,0,sizeof(vis));
    83     int rnt = sum;
    84     _for(len,a[1],sum/2+1)
    85     {
    86         if(sum % len != 0) continue;
    87         num = sum/len;
    88         vis[1] = 1;
    89         if(dfs(1,1,len-a[1]))
    90         {
    91             rnt = len;
    92             break;
    93         }
    94         vis[1]= 0;
    95     }
    96     write(rnt);
    97     return 0;
    98 }
  • 相关阅读:
    PHP实现无限极分类
    html2canvas生成并下载图片
    一次线上问题引发的过程回顾和思考,以更换两台服务器结束
    Intellij IDEA启动项目报Command line is too long. Shorten command line for XXXApplication or also for
    mq 消费消息 与发送消息传参问题
    idea 创建不了 java 文件
    Java switch 中如何使用枚举?
    Collections排序
    在idea 设置 git 的用户名
    mongodb添加字段和创建自增主键
  • 原文地址:https://www.cnblogs.com/Asurudo/p/11382993.html
Copyright © 2011-2022 走看看