USACO1.1 PROB Your Ride Is Here 比较分析
2015-12-15 21:17
225 查看
PROB Your Ride Is Here
有些星星上会有UFO来接地球人上去玩,但是这个UFO一次只能有一组人过去。所以要让这组人知道他们被选中了。方法是这样的,星星的名字和组名能确定一个小组该去哪儿。然后我们就要写一个程序,判断一组人是不是能去那个星星玩。
组名和星星名都能转化成数字,A就是1,Z就是26,按照字母顺序递增。举个例子,USACA就是21*19*1*3*15=17955。如果这个组名和星星名对应的数除以47的余数相等,意味着他们可以准备出发了。
写一个程序读星星名和组名,如果能去的话打印GO,如果不能去打印STAY。名字没有空格和标点符号最多有六个字母。
(默认是大写字母)
下边是自己写的代码,因为难度不大也不涉及什么算法所以就不写注释了。但是一直提交了好几次才过,第一个原因是因为开始忘记了在输出结果‘'\n',题目里明明还提示了,真是太愚蠢了。第二个原因是写死了名字的长度,没注意是最多有6个也可以少于6个。
下边是测试的数据:
成功运行会出现这样的结果:
下边是答案给出的解法:
A的ASCII码是64,在汇编语言中A与a的ASCII码都经常使用。在进行与字母有关的计算时考虑ASCII码会容易很多,否则不能写26个if啊。
答案比我多出一个判断是否为字母的情况,值得学习。还有指针型变量简直我的弱项。
Programming Contest Problem Types
Hal Burch在1999年的初春搞了个分析,他发现算法只有16种问题。基本上IOI中80%的问题都出自其中。这些问题如下:
动态规划
贪心
完全路径
填色问题
最短路径
递归
最小生成树
背包问题
几何问题
网络流
欧拉路径
凸边形问题
大数问题
启发式搜索
近似搜索
杂项题(参考网络翻译)
最复杂的就是组合问题了,里边各种问题嵌套啊组合什么的可麻烦了。如果你能解决上述问题的40%,你就能在IOI里边拿银牌了,如果有80%金牌就妥妥的了。当然啦,这很难,多做题才能多提高。
补充一下:我发现几乎所有的算法我都学过了,也大概知道咋描述,但真让我码代码我就废了
所以程序猿的等级高低还是看算法啊。
Ad Hoc Problems
杂项题就是没啥固定解法的算法问题。每个问题都是不一样的,所以也就没啥固定的套路。
当然啦,这种问题就很欢乐,每遇到一个就是一个新挑战。一般这些问题都需要搞一个新型数据结构,循环和条件都跟人不一样。有时,由于太罕见了它们还要一些特别的组合方式。
做这种题就要仔细读,使劲读,把里边乱七八糟的东西全找出来。然后还要注意要优化,不可能你一下子循环5遍以上。
一般在网络上更容易出现这种杂项题。
如果你不能分清楚一个题到底是啥类型,你就一直把这个题当杂项题做吧哈哈哈。
上边那个问题就是简单的杂项题。
有些星星上会有UFO来接地球人上去玩,但是这个UFO一次只能有一组人过去。所以要让这组人知道他们被选中了。方法是这样的,星星的名字和组名能确定一个小组该去哪儿。然后我们就要写一个程序,判断一组人是不是能去那个星星玩。
组名和星星名都能转化成数字,A就是1,Z就是26,按照字母顺序递增。举个例子,USACA就是21*19*1*3*15=17955。如果这个组名和星星名对应的数除以47的余数相等,意味着他们可以准备出发了。
写一个程序读星星名和组名,如果能去的话打印GO,如果不能去打印STAY。名字没有空格和标点符号最多有六个字母。
(默认是大写字母)
下边是自己写的代码,因为难度不大也不涉及什么算法所以就不写注释了。但是一直提交了好几次才过,第一个原因是因为开始忘记了在输出结果‘'\n',题目里明明还提示了,真是太愚蠢了。第二个原因是写死了名字的长度,没注意是最多有6个也可以少于6个。
#include <iostream> #include <fstream> #include <string> using namespace std; int buffer[2][6]; int main() { string line; int i = 0; int result[2]={1,1}; int length; ofstream fout ("ride.out"); ifstream fin ("ride.in"); if(fin) { while(getline(fin,line)) { length = line.size(); for(int j = 0; j < length; j++) { buffer[i][j] = (int)line[j]; buffer[i][j] = buffer[i][j] - 64; result[i] = result[i]*buffer[i][j]; } i++; } } if(result[0]%47 == result[1]%47) { fout<<"GO\n"; } else { fout<<"STAY\n"; } return 0; }
下边是测试的数据:
成功运行会出现这样的结果:
下边是答案给出的解法:
#include <stdio.h> #include <ctype.h> int hash(char *s) { int i, h; h = 1; for(i=0; s[i] && isalpha(s[i]); i++) h = ((s[i]-'A'+1)*h) % 47; return h; } void main(void) { FILE *in, *out; char comet[100], group[100]; /* bigger than necessary, room for newline */ in = fopen("input.txt", "r"); out = fopen("output.txt", "w"); fgets(comet, sizeof comet, in); fgets(group, sizeof group, in); if(hash(comet) == hash(group)) fprintf(out, "GO\n"); else fprintf(out, "STAY\n"); exit (0); }一个C语言的代码,分析一下它的流程,文件读写是C的方式。写了一个函数用来比较,和我代码里使用的方式是相似的,用ascii码来计算字母对应的数字。
A的ASCII码是64,在汇编语言中A与a的ASCII码都经常使用。在进行与字母有关的计算时考虑ASCII码会容易很多,否则不能写26个if啊。
答案比我多出一个判断是否为字母的情况,值得学习。还有指针型变量简直我的弱项。
Programming Contest Problem Types
Hal Burch在1999年的初春搞了个分析,他发现算法只有16种问题。基本上IOI中80%的问题都出自其中。这些问题如下:
动态规划
贪心
完全路径
填色问题
最短路径
递归
最小生成树
背包问题
几何问题
网络流
欧拉路径
凸边形问题
大数问题
启发式搜索
近似搜索
杂项题(参考网络翻译)
最复杂的就是组合问题了,里边各种问题嵌套啊组合什么的可麻烦了。如果你能解决上述问题的40%,你就能在IOI里边拿银牌了,如果有80%金牌就妥妥的了。当然啦,这很难,多做题才能多提高。
补充一下:我发现几乎所有的算法我都学过了,也大概知道咋描述,但真让我码代码我就废了
所以程序猿的等级高低还是看算法啊。
Ad Hoc Problems
杂项题就是没啥固定解法的算法问题。每个问题都是不一样的,所以也就没啥固定的套路。
当然啦,这种问题就很欢乐,每遇到一个就是一个新挑战。一般这些问题都需要搞一个新型数据结构,循环和条件都跟人不一样。有时,由于太罕见了它们还要一些特别的组合方式。
做这种题就要仔细读,使劲读,把里边乱七八糟的东西全找出来。然后还要注意要优化,不可能你一下子循环5遍以上。
一般在网络上更容易出现这种杂项题。
如果你不能分清楚一个题到底是啥类型,你就一直把这个题当杂项题做吧哈哈哈。
上边那个问题就是简单的杂项题。
相关文章推荐
- PostgreSQL新手入门教程
- Ajax PHP简单入门教程代码
- Nodejs学习笔记之入门篇
- jQuery入门 构造函数
- jQuery入门介绍之基础知识
- 针对初学者的jQuery入门指南
- jquery 指南/入门基础
- JDBCTM 指南:入门
- struts2入门Demo示例
- JSP入门教程(4)
- JSP入门教程(3)
- C#语言初级入门介绍
- JSP入门教程(1)
- JSP入门教程(2)
- JavaScript入门学习书籍推荐
- Linux 入门常用命令 password ― 修改密码,改变用户
- 安全检测Unix和Linux服务器安全设置入门精讲
- System.Web.Routing入门及进阶
- System.Web.Routing入门及进阶
- C++入门概览和尝试创建第一个C++程序