zoukankan      html  css  js  c++  java
  • POJ 1129 Channel Allocation

      在一个区域内,有许多电台,如果覆盖有交集的话可能会互相干扰,唯一的解决方案就是使用不同的频道。

      但是频道这种资源非常珍贵,所以应使用尽量少的频道。

      感觉是模拟题,不知道为啥放在了搜索里面。Discuss里面有大牛说用四色定理,作为一名离散只考了70+的选手也没有去看......也可能是后台比较水,我的这种方法竟然也是0ms。

      解题思路都写在了注释里。

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cstdio>
     6 
     7 using namespace std;
     8 
     9 struct N
    10 {
    11     char data;
    12     N *next;
    13 }*head[27];
    14 
    15 bool hash[27][27],Num[27];//hash[][]标记每一个电台可以使用的频道或者已经使用过的频道
    16                                     //Num[] 标记总共有多少频道被使用
    17 
    18 N *creat()
    19 {
    20     N *p = (N *)malloc(sizeof(N));
    21     p->next = NULL;
    22     return p;
    23 }
    24 
    25 void link(char h,char r)//建图
    26 {
    27     N *p,*q;
    28     p = head[h-'A'];
    29     q = creat();
    30     q->data = r;
    31     q->next = p->next;
    32     p->next = q;
    33 }
    34 
    35 void CheckChannel(char h)
    36 {
    37     int i;
    38 
    39     for(i = 0;i < 26 && hash[h-'A'][i] != false; ++i)//尽量选取编号小的频道
    40     ;
    41 
    42 
    43     hash[h-'A'][i] = true;//标记该频道 表明此频道已使用
    44 
    45     Num[i] = true;
    46 
    47     N *p;
    48     for(p = head[h-'A']->next; p != NULL; p = p->next)//和当前电台的有交集的 显然也不能使用当前频道
    49     {
    50         hash[p->data - 'A'][i] = true;
    51     }
    52 }
    53 
    54 int main()
    55 {
    56     int n,i,sum;
    57     char re[50];
    58     while(scanf("%d",&n) && n)
    59     {
    60 
    61         memset(hash,false,sizeof(hash));
    62         memset(Num,false,sizeof(Num));
    63 
    64         for(i = 0;i < n; ++i)
    65         {
    66             head[i] = creat();
    67             scanf("%s",re);
    68             for(int j = 2,l = strlen(re);j < l; ++j)
    69             {
    70                 link(re[0],re[j]);
    71             }
    72         }
    73         for(i = 0;i < n; ++i)//枚举所有的电台
    74         {
    75             CheckChannel('A'+i);
    76         }
    77         for(sum = 0,i = 0;i < 27; ++i)//统计出现过的电台
    78             if(Num[i])
    79                 sum++;
    80 
    81         printf("%d",sum);
    82         if(sum == 1)
    83             printf(" channel needed.
    ");
    84         else
    85             printf(" channels needed.
    ");
    86     }
    87 }

      今天好顺啊 ,拿了第二个1A了....

      

      

  • 相关阅读:
    spring事务详解(一)初探讨
    spring事务详解(二)实例
    mysql删除重复数据只保留一条
    jdk1.8源码Synchronized及其实现原理
    jdk1.8源码Thread与Runnable区别
    动态创建类并添加属性赋值
    c# 当代热门技术
    c# 开源框架
    极限并发带来的思考(12306 抢票)
    ASP.NET Core 使用外部登陆提供程序登陆的流程,以及身份认证的流程 (Challenge)
  • 原文地址:https://www.cnblogs.com/zmx354/p/3274377.html
Copyright © 2011-2022 走看看