USACO 4.3 Letter Game (暴力)

2015-03-26 21:12:35

思路:暴力模拟... 由于题目单词的长度限制在了3~7,所以就算多个单词凑起来也最多只能2个。

  根据这个重要的推断,我们只要暴力枚举1个 / 2个凑在一起即可。

  

  1 /*
  2 ID:naturec1
  3 PROG: lgame
  4 LANG: C++
  5 */
  6 #include <cstdio>
  7 #include <cstring>
  8 #include <cstdlib>
  9 #include <cmath>
 10 #include <vector>
 11 #include <map>
 12 #include <set>
 13 #include <stack>
 14 #include <queue>
 15 #include <string>
 16 #include <fstream>
 17 #include <iostream>
 18 #include <algorithm>
 19 using namespace std;
 20 
 21 #define MEM(a,b) memset(a,b,sizeof(a))
 22 #define REP(i,n) for(int i=1;i<=(n);++i)
 23 #define REV(i,n) for(int i=(n);i>=1;--i)
 24 #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
 25 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
 26 #define getmid(l,r) ((l) + ((r) - (l)) / 2)
 27 #define MP(a,b) make_pair(a,b)
 28 #define X first
 29 #define Y second
 30 
 31 typedef long long ll;
 32 typedef pair<int,int> pii;
 33 const int INF = (1 << 30) - 1;
 34 
 35 string s[40000];
 36 int scnt = 0;
 37 
 38 void Read(){
 39     ifstream fin("lgame.dict");
 40     while(getline(fin,s[scnt++])){
 41         if(s[scnt - 1][0] == '.')
 42             break;
 43     }
 44     fin.close();
 45 }
 46 
 47 int val[200],num[200];
 48 vector<pair<string,int> > g;
 49 string str;
 50 
 51 struct node{
 52     string a,b;
 53     int val;
 54     node() {}
 55     node(string ta,string tb,int tval) :
 56         a(ta) , b(tb) , val(tval) {}
 57 };
 58 
 59 vector<node> ans;
 60 
 61 bool cmp(node a,node b){
 62     return a.a < b.a;
 63 }
 64 
 65 int main(){
 66     Read();
 67     freopen("lgame.in","r",stdin);
 68     freopen("lgame.out","w",stdout);
 69     val['e'] = val['i'] = val['s'] = 1;
 70     val['r'] = val['t'] = val['a'] = val['n'] = 2;
 71     val['o'] = val['l'] = 3;
 72     val['u'] = val['d'] = val['c'] = 4;
 73     val['y'] = val['p'] = val['g'] = val['h'] = val['b'] = val['m'] = 5;
 74     val['w'] = val['f'] = val['k'] = val['v'] = 6;
 75     val['q'] = val['j'] = val['z'] = val['x'] = 7;
 76     cin >> str;
 77     for(int i = 0; i < str.size(); ++i)
 78         num[str[i]]++;
 79     int cur,len,tnum[200],val_max = 0;
 80     bool flag;
 81     for(int i = 0; i < scnt; ++i){
 82         len = s[i].size();
 83         MEM(tnum,0);
 84         flag = true;
 85         cur = 0;
 86         for(int j = 0; j < len; ++j){
 87             tnum[s[i][j]]++;
 88             cur += val[s[i][j]];
 89             if(tnum[s[i][j]] > num[s[i][j]]){
 90                 flag = false;
 91                 break;
 92             }
 93         }
 94         if(flag){
 95             g.push_back(MP(s[i],cur));
 96             val_max = max(val_max,cur);
 97         }
 98     }
 99     int l1,l2;
100     int tnum2[200];
101     for(int i = 0; i < g.size(); ++i){
102         l1 = g[i].X.size();
103         MEM(tnum,0);
104         for(int j = 0; j < l1; ++j)
105             tnum[g[i].X[j]]++;
106         for(int j = i + 1; j < g.size(); ++j){
107             memcpy(tnum2,tnum,sizeof(tnum));
108             flag = true;
109             l2 = g[j].X.size();
110             for(int k = 0; k < l2; ++k){
111                 tnum2[g[j].X[k]]++;
112                 if(tnum2[g[j].X[k]] > num[g[j].X[k]]){
113                     flag = false;
114                     break;
115                 }
116             }
117             if(flag){
118                 ans.push_back(node(g[i].X,g[j].X,g[i].Y + g[j].Y));
119                 val_max = max(val_max,g[i].Y + g[j].Y);
120             }
121         }
122     }
123     printf("%d\n",val_max);
124     for(int i = 0; i < g.size(); ++i) if(g[i].Y == val_max)
125         ans.push_back(node(g[i].X,"",g[i].Y));
126     sort(ans.begin(),ans.end(),cmp);
127     for(int i = 0; i < ans.size(); ++i) if(ans[i].val == val_max){
128         cout << ans[i].a;
129         if(ans[i].b.size()) cout << " " << ans[i].b;
130         puts("");
131     }
132     return 0;
133 }

 

posted @ 2015-03-26 21:38  Naturain  阅读(208)  评论(0编辑  收藏  举报