当前位置:   article > 正文

USACO Section 4.3 Letter Game_信游戏在家里和电视上都很流行。在游戏的一个版本中,每个字母都有一个值,你收

信游戏在家里和电视上都很流行。在游戏的一个版本中,每个字母都有一个值,你收

题意:

每个字符有个价值  一个字符串的价值是所有字符和  输入一些字符和一个字典  每种方法之多包含字典里两个串  每种方法的字符必须都包含在输入的一堆字符中  问  方法最大价值是多大  按字典序输出所有方法 (每个串最多7个字符)


思路:

字典中4W个单词  要是n^2枚举所有方法一定会TLE  但是串最多7个字符值得利用

输入的一堆字符一用7!种排列  每种方法最多两个串  也就是说可以枚举7*7即可得到所有方法  然后看方法中的串是否都在字典中  在根据题意维护价值最大


代码:

  1. /*
  2. ID: housera1
  3. PROG: lgame
  4. LANG: C++
  5. */
  6. #include<cstdio>
  7. #include<cstring>
  8. #include<algorithm>
  9. #include<string>
  10. #include<set>
  11. #include<iostream>
  12. using namespace std;
  13. int val[]={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};
  14. set<string> st;
  15. string fir,str,tmp1,tmp2;
  16. int ans;
  17. struct ways
  18. {
  19. string a,b;
  20. bool operator<(const ways fa) const
  21. {
  22. if(a!=fa.a) return a<fa.a;
  23. return b<fa.b;
  24. }
  25. }way;
  26. set<ways> fzc;
  27. set<ways>::iterator it;
  28. int main()
  29. {
  30. ios::sync_with_stdio(false);
  31. int Debug=0;
  32. if(!Debug)
  33. {
  34. freopen("lgame.in","r",stdin);
  35. freopen("lgame.out","w",stdout);
  36. }
  37. int i,j,k,len,sz,num1,num2,sum;
  38. cin>>fir;
  39. len=fir.size();
  40. sort(fir.begin(),fir.end());
  41. if(!Debug) freopen("lgame.dict","r",stdin);
  42. while(cin>>str)
  43. {
  44. if(str==".") break;
  45. st.insert(str);
  46. }
  47. do
  48. {
  49. for(i=0;i<len;i++)
  50. {
  51. tmp1=fir.substr(0,i+1);
  52. if(st.find(tmp1)==st.end()) continue;
  53. for(k=0,sz=tmp1.size(),num1=0;k<sz;k++) num1+=val[tmp1[k]-'a'];
  54. for(j=i;j<len;j++)
  55. {
  56. num2=0;
  57. if(i!=j)
  58. {
  59. tmp2=fir.substr(i+1,j-i);
  60. if(tmp2<tmp1||st.find(tmp2)==st.end()) continue;
  61. for(k=0,sz=tmp2.size();k<sz;k++) num2+=val[tmp2[k]-'a'];
  62. }
  63. else tmp2.clear();
  64. sum=num1+num2;
  65. if(sum>ans)
  66. {
  67. ans=sum;
  68. fzc.clear();
  69. way.a=tmp1;
  70. way.b=tmp2;
  71. fzc.insert(way);
  72. }
  73. else if(sum==ans)
  74. {
  75. way.a=tmp1;
  76. way.b=tmp2;
  77. fzc.insert(way);
  78. }
  79. }
  80. }
  81. }while(next_permutation(fir.begin(),fir.end()));
  82. cout<<ans<<endl;
  83. for(it=fzc.begin();it!=fzc.end();it++)
  84. {
  85. cout<<(*it).a;
  86. if(!(*it).b.empty()) cout<<" "<<(*it).b;
  87. cout<<endl;
  88. }
  89. return 0;
  90. }
  91. /*
  92. prmgroa
  93. profile
  94. program
  95. prom
  96. rag
  97. ram
  98. rom
  99. .
  100. */


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/710478
推荐阅读
相关标签
  

闽ICP备14008679号