1 条题解
-
0
🔍 解题思路
题目意思大致如下:
首先给你一个可用字符集,比如:prog
那么我们需要计算的单词,都是在这个集合内的元素,否则单词的权值是0
那么可以组成的单词rog pog rop等等
计算单词的最大权值,但是单词可以拼接起来。
但是拼接起来后还是要在可用集合中,且个数都不能超支
#include<bits/stdc++.h> using namespace std; char s[16]; int cnt[256]; int tot[256]; int m[256]; struct DICT { char words[10]; int len,val; }dic[40010]; int tovalue(char ch[]) { int sum=0; for(int i=0;ch[i]!='\0';++i) sum+=m[ch[i]]; return sum; } int add(int list[],char ch[]) { for(int i=0;ch[i]!='\0';++i){ ++list[ch[i]]; if(list[ch[i]]>tot[ch[i]]) return false; } return true; } int main() { m['q']=7;m['w']=6;m['e']=1;m['r']=2;m['t']=2;m['y']=5;m['u']=4;m['i']=1;m['o']=3;m['p']=5; m['a']=2;m['s']=1;m['d']=4;m['f']=6;m['g']=5;m['h']=5;m['j']=7;m['k']=6;m['l']=3; m['z']=7;m['x']=7;m['c']=4;m['v']=6;m['b']=5;m['n']=2;m['m']=5; int ans=0; scanf("%s",s); for(int i='a';i<='z';++i) tot[i]=0; for(int i=0;s[i]!='\0';++i) ++tot[s[i]]; int s_len=strlen(s); int dic_index=0; while(scanf("%s",s)==1&&s[0]!='.'){ for(int i='a';i<='z';++i) cnt[i]=0; int v=tovalue(s); int len=strlen(s); if(add(cnt,s)==1) ans=max(ans,v); if((s_len==6&&len==3)||(s_len==7&&len<=4)){ strcpy(dic[dic_index].words,s); dic[dic_index].len=len; dic[dic_index].val=v; ++dic_index; } } if(s_len>=6){ for(int i=0;i<dic_index;++i) for(int j=i+1;j<dic_index;++j){ for(int k='a';k<='z';++k) cnt[k]=0; if(!add(cnt,dic[i].words)) continue; if(!add(cnt,dic[j].words)) continue; ans=max(ans,dic[i].val+dic[j].val); } } printf("%d",ans); return 0; }
- 1
信息
- ID
- 172
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者