原题链接 http://acm.pku.edu.cn/JudgeOnline/problem?id=1171
版权声明:版权归作者WeiSteven所有,转载请注明!
题目意思大致如下:
首先给你一个可用字符集,比如:prog
那么我们需要计算的单词,都是在这个集合内的元素,否则单词的权值是0
那么可以组成的单词rog pog rop等等
计算单词的最大权值,但是单词可以拼接起来。
但是拼接起来后还是要在可用集合中,且个数都不能超支。
下面是题目对用的程序:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://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
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