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

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

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

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <cctype>
  7. #include <iostream>
  8. #define For(i, l, r) for(int i = (l); i <= (int)(r); ++i)
  9. #define Fordown(i, r, l) for(int i = (r); i >= (int)(l); --i)
  10. #define Set(a, v) memset(a, v, sizeof(a))
  11. using namespace std;
  12.  
  13. inline int read(){
  14. int x = , fh = ; char ch;
  15. for(; !isdigit(ch); ch = getchar()) if (ch == '-') fh = -;
  16. for(; isdigit(ch); ch = getchar()) x = (x<<) + (x<<) + (ch^'');
  17. return x * fh;
  18. }
  19.  
  20. const int N = ;
  21. const int score[]={, , , , , , , , , , , , , , , , , , , , , , , , , };
  22. //当然要把这个表打出来了。。但我太懒了。。copy了一下redbag大神的。。
  23.  
  24. struct node {
  25. char str[];
  26. int dig[]; //存储了每个单词出现的次数
  27.  
  28. void update () {
  29. int n = strlen(str);
  30. Set(dig, );
  31. For (i, , n-)
  32. dig[str[i] - 'a'] ++;
  33. } //更新每个字符出现的次数
  34.  
  35. int calc () {
  36. int ans = ;
  37. For (i, , )
  38. ans += dig[i] * score[i];
  39. return ans;
  40. } //计算这个单词的得分
  41.  
  42. bool operator > (const node &rhs) const {
  43. For (i, , )
  44. if (dig[i] > rhs.dig[i]) return true;
  45. return false;
  46. } //比较单词每个字母出现次数多少 如果多的话 则不满足题目要求
  47.  
  48. node operator + (const node &rhs) const {
  49. node ans;
  50. Set(ans.dig, );
  51. For (i, , )
  52. ans.dig[i] = dig[i] + rhs.dig[i];
  53. return ans;
  54. } //把两个单词出现次数加起来
  55. };
  56.  
  57. node standard, word[N];
  58. int cnt = ;
  59. struct ans_pair {
  60. int word1, word2; //答案的词对 如果只有一个单词则第二个为0 这个存储的是单词的编号
  61. };
  62.  
  63. #include <vector>
  64. vector <ans_pair> lt; //听说 不定长数组 和 答案序列 更配哦 (滑稽)
  65.  
  66. int ans_num = ;
  67. int main(){
  68. scanf ("%s", standard.str);
  69. standard.update(); //把初始的标准更新
  70. while (scanf ("%s", word[cnt].str) != EOF && word[cnt].str[] != '.') {
  71. word[cnt].update();
  72. if (word[cnt] > standard) continue; //如果不满足要求就不能存储 让下一个输入的覆盖掉
  73. ++cnt;
  74. }
  75. --cnt; //去掉最后一个'.'
  76. For (i, , cnt) {
  77. int now_score = ; //当前成绩
  78. now_score = word[i].calc();
  79. if (now_score > ans_num)
  80. {ans_num = now_score; lt.clear(); lt.push_back((ans_pair) {i, } );} //比原来答案大 就更新一下
  81. else if (now_score == ans_num) lt.push_back((ans_pair) {i, } ); //相同就放入vector
  82.  
  83. For (j, i+, cnt) {
  84. node new_word = word[i] + word[j]; //计算合并后单词的dig
  85. if (new_word > standard ) continue; //不满足要求就继续找
  86. now_score = new_word.calc(); //计算成绩
  87. if (now_score > ans_num) //同上
  88. {ans_num = now_score; lt.clear(); lt.push_back((ans_pair) {i, j} );}
  89. else if (now_score == ans_num) lt.push_back((ans_pair) {i, j} );
  90. }
  91. }
  92.  
  93. printf ("%d\n", ans_num);
  94. For (i, , lt.size()-) {
  95. int fir = lt[i].word1, sec = lt[i].word2; //first 第一个单词 second 第二个单词
  96. if (sec) printf ("%s %s\n", word[fir].str, word[sec].str);
  97. else printf ("%s\n", word[fir].str); //如果只有一个单词 输出第一个单词就好了
  98. }
  99. }

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. nginx + tomcat实现负载均衡

    作者Mr.Chen,转载请注明博客出处:http://www.cnblogs.com/cjh-notes/ 负载均衡 负载均衡就是流量分发,优选软件解决方案,成本低效果好. 实现步骤 第一步:下载安装 ...

  2. 让我们一起摇摆 Turnipbit体感遥控车

    相信大家对Microbit是非常熟悉的,而今天我们做的这个小玩具所用的核心板是Turnipbit,是基于 Microbit开发的一块适合儿童适用的板卡.基本使用原理是一样的,这里就不多介绍了,代码这方 ...

  3. Hive metastore源码阅读(一)

    不要问我为什么,因为爱,哈哈哈哈...进入正题,最近做项目顺带学习了下hive metastore的源码,进行下知识总结. hive metastore的整体架构如图: 一.组成结构: 如图我们可以看 ...

  4. nginx的负载均衡集群测试

    分别在3台机子安装nginx和启动nginx服务. dir: 192.168.0.7 另外2台服务器为 192.168.0.5 ,192.168.0.6 在dir  192.168.0.7 上增加配置 ...

  5. 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码

    洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication[最小割]分析+题解代码 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流. ...

  6. MySQL的InnoDB引擎与MyISAM引擎

    MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与 ...

  7. Linux下yum安装MysqL数据库

    1.命令安装mysql # yum install mysql mysql-server mysql-devel -y 最后提示 Complete!  表示安装成功 2.查看是否生成了mysqld服务 ...

  8. 如何学习 MFC ?

    //std::string => CString std::string srcString = "Hello World!"; CString dstString = CS ...

  9. SpringBoot idea maven打包war

    什么都不需要配置,跟着做! pom.xml修改打包类型为war <packaging>war</packaging> 排除内置Tomcat <!--因配置外部TOMCAT ...

  10. Linux的软链接和硬链接

    1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接]硬连接指通过索引节点 ...