usaco Letter Game

本文介绍了一种使用C++实现的单词游戏算法,通过计算单词的值并找出最大值单词,展示了完整的代码实现过程。文章包括了初始化单词价值、读取输入、计算单词值及寻找最优组合等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先计算出每个单词的值,如果单词不合法则为-1,同时找出最大的单词。

然后输出。

/*
ID: modengd1
PROG: lgame
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
int value[257];
int f[256];
bool useful[256];
bool legal[40000];
int valueofworde[40000];
int cal(string S,string S2)//次单词是否合法,不合法返回-1,合法返回这个词的值
{
    int counter[256];
    memset(counter,0,sizeof(counter));
    int ret=0;
    for(int i=0;i<S.size();i++)
    {
        counter[S[i]]++;
        if(!useful[S[i]]||counter[S[i]]>f[S[i]])
            return -1;
        ret+=value[S[i]];
    }
    for(int i=0;i<S2.size();i++)
    {
        counter[S2[i]]++;
        if(!useful[S2[i]]||counter[S2[i]]>f[S2[i]])
            return -1;
        ret+=value[S2[i]];
    }
    return ret;
}
void init()
{
    value['q']=value['j']=value['x']=value['z']=7;
    value['w']=value['f']=value['k']=value['v']=6;
    value['e']=value['s']=value['i']=1;
    value['r']=value['t']=value['a']=value['n']=2;
    value['o']=value['l']=3;
    value['u']=value['d']=value['c']=4;
    value['p']=value['g']=value['b']=value['m']=value['y']=value['h']=5;
}
int main()
{
    freopen("lgame.in","r",stdin);
    freopen("lgame.out","w",stdout);
    init();
    vector<string> dict;
    char ch;
    int maxvalue=0;
    char temp[10];
    FILE *in2 = fopen ("lgame.dict", "r");
    vector<int> index[43];//单词值为i的单词在字典中的位置
    memset(useful,false,sizeof(useful));
    memset(f,0,sizeof(f));
    while(~scanf("%c",&ch))
    {
        useful[ch]=true;
        f[ch]++;
    }
    for(int i =0;~fscanf(in2,"%s",temp);i++)
    {
        if(temp[0]=='.')
            break;
        dict.push_back(temp);
        valueofworde[i]=cal(temp,"");
        if(valueofworde[i]!=-1)
            index[valueofworde[i]].push_back(i);
        maxvalue=max(maxvalue,valueofworde[i]);
    }
    for(int i=1;i<=42;i++)
    {
        for(int j=0;j<index[i].size();j++)
        {
            for(int k=0;k<=42;k++)
            {
                for(int m=0;m<index[k].size();m++)
                {
                    maxvalue=max(maxvalue,cal(dict[index[i][j]],dict[index[k][m]]));
                }
            }
        }
    }
    cout<<maxvalue<<endl;
    for(int i=0;i<dict.size();i++)
    {
        if(valueofworde[i]==maxvalue)
            cout<<dict[i]<<endl;
        else
        {
            int other=maxvalue-valueofworde[i];
            for(int j=0;j<index[other].size();j++)
            {
                if(index[other][j]>=i&&cal(dict[index[other][j]],dict[i])==maxvalue)
                {
                    cout<<dict[i]<<' '<<dict[index[other][j]]<<endl;
                }
            }
        }
    }
    return 0;
}

  

转载于:https://www.cnblogs.com/modengdubai/p/4852740.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值