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 
  • 相关阅读:
    MYSQL InnoDB二级索引存储主键值而不是存储行指针的优点与缺点
    公众号 苹果端点击事件委托不起作用而安卓可以
    php emoji表情转换
    PHP 获取网页所有链接
    node 一行一行的读取文件
    AsyncJS 异步流程控制DEMO详细介绍
    node.js 获取异步方法里面数据 的方式
    利用blob 加密防下载
    html css 3D轮播图
    transform和transition组合动画错误问题
  • 原文地址:https://www.cnblogs.com/weisteve/p/1797743.html
Copyright © 2011-2022 走看看