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
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
作者:W.M.steve
出处:http://www.cnblogs.com/weisteve/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/weisteve/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。