zoukankan      html  css  js  c++  java
  • POJ 1171 Letter Game 解题思路

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

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

     题目意思大致如下:

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

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

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

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

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

    下面是题目对用的程序:

    代码
     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 
  • 相关阅读:
    「HAOI2015」「LuoguP3178」树上操作(树链剖分
    「LuoguP3865」 【模板】ST表 (线段树
    「LuoguP3384」【模板】树链剖分
    「网络流24题」「Codevs1237」 餐巾计划问题
    「LuoguP1799」 数列_NOI导刊2010提高(06)
    「咕咕网校
    「数论」逆元相关
    「SHOI2007」「Codevs2341」 善意的投票(最小割
    「BZOJ3438」小M的作物(最小割
    「NOIP2005」「Codevs1106」篝火晚会
  • 原文地址:https://www.cnblogs.com/weisteve/p/1797743.html
Copyright © 2011-2022 走看看