POJ 1171 Letter Game 解题思路

原题链接 http://acm.pku.edu.cn/JudgeOnline/problem?id=1171

版权声明版权归作者WeiSteven所有,转载请注明! 

 题目意思大致如下:

首先给你一个可用字符集,比如:prog

那么我们需要计算的单词,都是在这个集合内的元素,否则单词的权值是0

 

那么可以组成的单词rog pog rop等等

 

计算单词的最大权值,但是单词可以拼接起来。

但是拼接起来后还是要在可用集合中,且个数都不能超支。

 

下面是题目对用的程序:

ExpandedBlockStart.gif 代码
 1  #include  < iostream >
 2  #include  < algorithm >
 3  using   namespace  std;
 4  struct  words{  char  word[ 8 ] ;  int  len , val ; } dic[ 40002 ];
 5  char  collect[ 8 ] ;
 6  int  used[ 26 ] , has[ 26 ] ,len , num , collect_max , tmax ;
 7  int  value[ 26 =  { 2 , 5 , 4 , 4 , 1 , 6 , 5 , 5 , 1 , 7 , 6 , 3 , 5 , 2 , 3 , 5 , 7 , 2 , 1 , 2 , 4 , 6 , 6 , 7 , 5 , 7 };
 8  bool  cmp( words p , words q ) {   return  p.len < q.len;  }
 9  int  main()
10  {
11    while ( (collect[len] = getchar())  &&  collect[len] != ' \n '  ) // 输入 collected。并记录其score:collect_max ,len。
12   { collect_max += value[collect[len] - ' a ' ];   ++ has[ collect[len] - ' a '  ];   ++ len ; }
13    while ( gets(dic[num].word) )
14   {
15     if ( dic[num].word[ 0 ] == ' . '  )  break  ;
16     int  i  =   - 1  ,sum  =   0  ;
17    memset(used ,  0  ,  26 * sizeof ( int )) ;
18     while ( dic[num].word[ ++ i] != 0  )
19    { 
20      if ++ used[dic[num].word[i] - ' a ' ] > has[dic[num].word[i] - ' a ' ] )  break ;
21     sum  +=  value[dic[num].word[i] - ' a ' ] ;
22    }
23     if (dic[num].word[i] == 0
24    { 
25      if (sum > tmax)  tmax = sum;
26      if ( i < 5 ) { dic[num].len = i; dic[num].val = sum;  ++ num; }
27    }
28   }
29   sort(dic,dic + num,cmp);
30    int  len3 = 0 ,k;
31    for ( int  i = 0 ;i < num; ++ i)  if (dic[i].len <= 3 ) len3 = i;
32    for ( int  score = collect_max ; score > 0  ;  -- score )
33   {
34     if (tmax == score) { printf( " %d\n " ,score);  return   0 ; }
35     for ( int  i = num - 1 ;i > 0 ; -- i) 
36      for ( int  j = len3;j >= 0 ; -- j)
37     {
38       if (i == j)  continue  ;
39      memset(used ,  0  ,  26 * sizeof ( int )) ;
40       for (k = 0 ;k < dic[i].len; ++ k)  ++ used[dic[i].word[k] - ' a ' ];
41       for (k = 0 ;k < dic[j].len; ++ k) 
42        if ( ++ used[dic[j].word[k] - ' a ' ] > has[dic[j].word[k] - ' a ' ])  break ;
43       if (k == dic[j].len && score == dic[i].val + dic[j].val)
44      { printf( " %d\n " ,score);  return   0 ; }
45     }
46   }
47    return   0 ;
48  }
49 

 

 

转载于:https://www.cnblogs.com/weisteve/archive/2010/08/12/1797743.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值