这个题。。。一开始看了很久题目(并且问了机房几个大佬)才明白题意。。 (原题入口

题意
大概是一开始给你一些字母出现的次数 你之后组成的单词(最多两个单词)每个字母出现次数 必须小于或等于标准(standard)的次数
其次是要满足你组成单词的 每个字符个数 * 该字符单个价值 最大。 如果有多解按字典序来。

自己的理解:
这个题目很良心 单词表可以去USACO官网上看。。都很短 而且给你的是按字典序来的 就不需要手动排序了
再其次楼下都讲了 很多单词存都不用存 一开始判断下就行了
对于这种东西 就应该用结构体存储 并且重载一些运算符 或者 成员函数 (因为很多操作是很重复的)
代码:

 #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cctype>
#include <iostream>
#define For(i, l, r) for(int i = (l); i <= (int)(r); ++i)
#define Fordown(i, r, l) for(int i = (r); i >= (int)(l); --i)
#define Set(a, v) memset(a, v, sizeof(a))
using namespace std; inline int read(){
int x = , fh = ; char ch;
for(; !isdigit(ch); ch = getchar()) if (ch == '-') fh = -;
for(; isdigit(ch); ch = getchar()) x = (x<<) + (x<<) + (ch^'');
return x * fh;
} const int N = ;
const int score[]={, , , , , , , , , , , , , , , , , , , , , , , , , };
//当然要把这个表打出来了。。但我太懒了。。copy了一下redbag大神的。。 struct node {
char str[];
int dig[]; //存储了每个单词出现的次数 void update () {
int n = strlen(str);
Set(dig, );
For (i, , n-)
dig[str[i] - 'a'] ++;
} //更新每个字符出现的次数 int calc () {
int ans = ;
For (i, , )
ans += dig[i] * score[i];
return ans;
} //计算这个单词的得分 bool operator > (const node &rhs) const {
For (i, , )
if (dig[i] > rhs.dig[i]) return true;
return false;
} //比较单词每个字母出现次数多少 如果多的话 则不满足题目要求 node operator + (const node &rhs) const {
node ans;
Set(ans.dig, );
For (i, , )
ans.dig[i] = dig[i] + rhs.dig[i];
return ans;
} //把两个单词出现次数加起来
}; node standard, word[N];
int cnt = ;
struct ans_pair {
int word1, word2; //答案的词对 如果只有一个单词则第二个为0 这个存储的是单词的编号
}; #include <vector>
vector <ans_pair> lt; //听说 不定长数组 和 答案序列 更配哦 (滑稽) int ans_num = ;
int main(){
scanf ("%s", standard.str);
standard.update(); //把初始的标准更新
while (scanf ("%s", word[cnt].str) != EOF && word[cnt].str[] != '.') {
word[cnt].update();
if (word[cnt] > standard) continue; //如果不满足要求就不能存储 让下一个输入的覆盖掉
++cnt;
}
--cnt; //去掉最后一个'.'
For (i, , cnt) {
int now_score = ; //当前成绩
now_score = word[i].calc();
if (now_score > ans_num)
{ans_num = now_score; lt.clear(); lt.push_back((ans_pair) {i, } );} //比原来答案大 就更新一下
else if (now_score == ans_num) lt.push_back((ans_pair) {i, } ); //相同就放入vector For (j, i+, cnt) {
node new_word = word[i] + word[j]; //计算合并后单词的dig
if (new_word > standard ) continue; //不满足要求就继续找
now_score = new_word.calc(); //计算成绩
if (now_score > ans_num) //同上
{ans_num = now_score; lt.clear(); lt.push_back((ans_pair) {i, j} );}
else if (now_score == ans_num) lt.push_back((ans_pair) {i, j} );
}
} printf ("%d\n", ans_num);
For (i, , lt.size()-) {
int fir = lt[i].word1, sec = lt[i].word2; //first 第一个单词 second 第二个单词
if (sec) printf ("%s %s\n", word[fir].str, word[sec].str);
else printf ("%s\n", word[fir].str); //如果只有一个单词 输出第一个单词就好了
}
}

luogu【P2753】[USACO4.3]字母游戏Letter Game的更多相关文章

  1. Luogu 1894 [USACO4.2]完美的牛栏The Perfect Stall / POJ 1274 The Perfect Stall(二分图最大匹配)

    Luogu 1894 [USACO4.2]完美的牛栏The Perfect Stall / POJ 1274 The Perfect Stall(二分图最大匹配) Description 农夫约翰上个 ...

  2. GUI线程 :打字母游戏

    代码: /** * */ package com.niit.syntronized; import java.awt.Color; import java.awt.FlowLayout; import ...

  3. JSP简单练习-猜字母游戏

    <!-- guessCharExample.jsp --> <%@ page contentType="text/html; charset=gb2312" %& ...

  4. 猜字母游戏(Java)

    我的代码: package day20181025; import java.util.Arrays; import java.util.Scanner; /** * 猜字母 * @author Ad ...

  5. Java入门第39课——猜字母游戏之实现字母生成方法

    问题        实现猜字母游戏中的字母生成方法,即,随机生成5个不同的字母作为猜测的结果. 方案        实现generate方法,首先声明一个字符类型的数组,用于存储26个大写字母,然后声 ...

  6. Java入门第38课——猜字母游戏之设计程序结构

    问题        本案例需要实现猜字母游戏程序中的程序结构 方案        分析猜字母游戏可以看出,程序首先需要随机产生5个不同的字母作为需要猜测的结果,因此,可以先定义一个方法,以实现此功能: ...

  7. Java入门第37课——猜字母游戏之设计数据结构

    问题        有猜字母游戏,其游戏规则为:程序随机产生5个按照一定顺序排列的字符作为猜测的结果,由玩家来猜测此字符串.玩家可以猜测多次,每猜测一次,则由系统提示结果.如果猜测的完全正确,则游戏结 ...

  8. Java实现猜字母游戏

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABRQAAAE9CAYAAAB6Cu4FAAAgAElEQVR4nOy995OUR77u2f/H3tjdey ...

  9. 华为机试题【13】-wave数组找字母游戏

    题目描述: Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉.如上图,假设给定单词if,你必须先吃掉i然后才能吃掉f. 但现在你的任务可没有这么简单,你 ...

随机推荐

  1. java环境搭建 windows

    windows搭建Java环境 1.下载java开发工具jdk安装包 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/inde ...

  2. 01 Mybatis 的配置和使用

    一.Mybatis 是什么 MyBatis 是一个支持普通SQL查询.存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索封装.MyB ...

  3. 正负样本比率失衡SMOTE

    正负样本比率失衡SMOTE [TOC] 背景 这几天测试天池的优惠券预测数据在dnn上面会不会比集成树有较好的效果,但是正负样本差距太大,而处理这种情况的一般有欠抽样和过抽样,这里主要讲过抽样,过抽样 ...

  4. linux server 常见参数修改

    文件描述符(file descriptors) /etc/security/limits.conf 这里是当前用户允许打开的文件描述符限制,可以用ulimit -n查看. 修改成如下配置:   * h ...

  5. href与src 区别

    src 是可替换的文本支撑,将指向的内容引入文档当前标签所在的位置, 当浏览器解析到该标签时,将暂停其它资源的下载处理, 请求该标签的src ,下载指向的外部资源并应用到当前文档, 所以js 脚本一般 ...

  6. display 的 32 种写法

    从大的分类来讲, display的 32种写法可以分为 6个大类,再加上 1个全局类,一共是 7大类: 外部值 内部值 列表值 属性值 显示值 混合值 全局值 外部值 所谓外部值,就是说这些值只会直接 ...

  7. 【JavaWeb】图书管理系统【总结】

    感想 该项目是目前为止,我写过代码量最多的项目了.....虽然清楚是没有含金量的[跟着视频来写的],但感觉自己也在进步中...... 写的过程中,出了不少的问题.....非常多的Servlet,JSP ...

  8. Flask從入門到入土(二)——請求响应與Flask扩展

    ———————————————————————————————————————————————————————————— 一.程序和請求上下文 Flask從客戶端收到請求時,要讓視圖函數能訪問一些對象 ...

  9. SpringBoot中关于Mybatis使用的三个问题

    SpringBoot中关于Mybatis使用的三个问题 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/8495453.html 原本是要讲讲PostgreSQL ...

  10. Springdata mongodb 版本兼容 引起 Error [The 'cursor' option is required, except for aggregate with the explain argument

    在Spring data mongodb 中使用聚合抛出异常 mongodb版本 为 3.6 org.springframework.dao.InvalidDataAccessApiUsageExce ...