POJ 1171 Letter Game 解题思路
2014-04-03 16:16
375 查看
原题链接 http://acm.pku.edu.cn/JudgeOnline/problem?id=1171 版权声明:版权归作者WeiSteven所有,转载请注明!
题目意思大致如下:
首先给你一个可用字符集,比如:prog
那么我们需要计算的单词,都是在这个集合内的元素,否则单词的权值是0
那么可以组成的单词rog pog rop等等
计算单词的最大权值,但是单词可以拼接起来。
但是拼接起来后还是要在可用集合中,且个数都不能超支。
下面是题目对用的程序:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](http://images.cnblogs.com/OutliningIndicators/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
题目意思大致如下:
首先给你一个可用字符集,比如:prog
那么我们需要计算的单词,都是在这个集合内的元素,否则单词的权值是0
那么可以组成的单词rog pog rop等等
计算单词的最大权值,但是单词可以拼接起来。
但是拼接起来后还是要在可用集合中,且个数都不能超支。
下面是题目对用的程序:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](http://images.cnblogs.com/OutliningIndicators/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
相关文章推荐
- CentOs 设置静态IP 方法
- 【javascript】iframe父子兄弟之间调用传值(contentWindow && parent) (推荐)
- 南阳理工OJ_题目540 奇怪的排序
- 在django项目中自定义manage命令(转)
- ruby富文本框
- Windows Server AppFabric 缓存容量规划指南
- OGR DXF Driver
- salt源码安装
- C++基础(三)const
- DP一题解题报告POJ1141 Brackets Sequence
- 《C++语言99个常见编程错误》读书笔记
- 感人故事和视频
- 人人德克萨斯牌出手规则整理
- 【回顾】中国剩余定理
- OpenMP相关知识索引
- 如何进行有效的沟通
- 【Z】男人应该努力去做的
- AScii表
- Windows VK_虚拟键盘表
- PPT快捷键大全