• 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 }
  • 相关阅读:
    Trachtenberg(特拉亨伯格)速算系统
    English Conversations You Can Download for Free (Spoken English MP3/Audio Files)
    rel=nofollow 是什么意思
    移动端 触摸事件 ontouchstart、ontouchmove、ontouchend、ontouchcancel
    <mate name="viewport">移动端设置详解
    jquery简单实现tab选项卡效果
    PHP new StdClass()创建空对象
    PHP可变函数
    jQuery中this与$(this)的区别实例
    jQuery给动态添加的元素绑定事件的方法
  • 原文地址:https://www.cnblogs.com/Asurudo/p/11382993.html
Copyright © 2020-2023  润新知