zoukankan      html  css  js  c++  java
  • poj 1167 简单搜索

    这题主要是注意好限定的条件

    条件1:每个公交车都至少要到达两次

    条件2:公交车相同时间和相同间隔是属于两种车辆

    条件3:不同的车可能到达时间相同

    上述都是深搜的重要条件:

     1 #include<algorithm>
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cstring>
     6 #include<cmath>
     7 using std::sort;
     8 int const N = 1000;
     9 struct node
    10 {
    11        int begin,interval,Count;
    12        bool operator <(const node &tmp)const
    13        {
    14             return Count>tmp.Count;
    15        }
    16 }bus[N];
    17 int sum[N],n,val,cnt,ans;
    18 int Min(int a,int b)
    19 {
    20     return a<b?a:b;
    21 }
    22 bool judge(int b,int inter)
    23 {
    24      for(int i=b;i<=59;i+=inter)
    25      {
    26          if(sum[i]==0)
    27             return false;
    28      }
    29      return true;
    30 }
    31 void dfs(int t,int num)
    32 {
    33      if(n<=0)
    34      {
    35         ans=Min(num,ans);
    36         return ;
    37      }
    38      for(int i=t;i<cnt;i++)
    39      {
    40          if(num+(n/bus[i].Count)>=ans)return ;
    41          if(judge(bus[i].begin,bus[i].interval))
    42          {
    43             for(int j=bus[i].begin;j<=59;j+=bus[i].interval)
    44             {
    45                 sum[j]--;
    46                 n--;
    47             }
    48             dfs(i,num+1);
    49             for(int j=bus[i].begin;j<=59;j+=bus[i].interval)
    50             {
    51                 sum[j]++;
    52                 n++;
    53             }
    54          }
    55      }
    56 }
    57 int main()
    58 {
    59     while(~scanf("%d",&n))
    60     {
    61           memset(sum,0,sizeof(sum));
    62           cnt=0;
    63           for(int i=0;i<n;i++)
    64           {
    65               scanf("%d",&val);
    66               sum[val]++;
    67           }
    68           for(int i=0;i<=29;i++)
    69           {
    70               if(sum[i]==0)continue;
    71               for(int j=i+1;j<=59-i;j++)
    72               {
    73                   if(judge(i,j))
    74                   {
    75                      bus[cnt].begin=i;
    76                      bus[cnt].interval=j;
    77                      bus[cnt].Count=(59-i)/j+1;
    78                      cnt++;
    79                   }
    80               }
    81           }
    82           ans=17;
    83           sort(bus,bus+cnt);
    84           dfs(0,0);
    85           printf("%d
    ",ans);
    86     }
    87     return 0;
    88 }
    View Code
  • 相关阅读:
    Java基础03 基本程序设计结构
    Java基础02 开发环境搭建
    Java基础01 Java简介
    手动获取Spring上下文和Bean对象
    SAX解析XML
    Hbuilderx换行问题(属性合并一行展示)
    hbuilderx快捷键、回到上一步、回到上次编辑处
    查看jQuery版本号
    【基础篇】js对本地文件增删改查
    【基础篇】js对本地文件增删改查--查
  • 原文地址:https://www.cnblogs.com/nuoyan2010/p/3205079.html
Copyright © 2011-2022 走看看