ACM/ICPC算法基础训练教程(1)

关于《ACM/ICPC算法基础训练教程》这本书的一些解释与自我理解

第一章 基础算法

本章介绍最基础的算法,这些算法的思想简单明确,初学者应该首先熟练掌握这些算法。大部分情况下,这些算法不会作为单独的知识点进行考察,而是作为其他算法思想中的一部分,或者配合其他算法一起来求解问题。

1.1 模拟题

1.1.1基本概念

模拟题就是按照题目给出的十分明确的规则对输入数据进行处理,并按照输出规则进行输出的题目。
模拟题有着非常鲜明的特征:
(1)题目描述较长,主要是为了清晰地描述题目定义的规则(也有的题目因使用公认的规则而描述较短,如大数的四则运算等)。
(2)基本不涉及高深的算法,也不需要对题目本身进行比较深人的思考。
(3)代码量大,细节较多,出现错误不易排查。
模拟题有简单题也有复杂题。简单题规则较少,且浅显易懂,适合作为初学者的入门题目,用来熟悉编程语言的输入输出以及简单库函数的使用等;也有一些复杂的题目,规则很多,编程复杂度非常高,对代码的控制能力要求十分严格,少则百余行,多则数百行稍不留意就会出现错误。
对于题目较长的模拟题,建议阅读题目的时候把关键的语句标注出来,以免编写代码的时候有疏忽遗漏的地方,当对某个细节感到模糊的时候,最好的方法是再次仔细阅读题目描述,而不是把自己的看法作为题目的规则,更不能妄加揣测、无中生有。

1.1.2 例题讲解

【例1-1】Counting Sheep.
题目描述:
共有 n(n<=20)组数据,其中每组数据有一个正整数m(m<=10),然后是m个单词,统计其中有多少个“sheep”。单词大小写敏感,因而“Sheep”等不匹配。
输入样例:
4
5
shep sheeps sheep ship Sheep
7
sheep sheep SHEEP sheep shepe shemp seep
10
sheep sheep sheep sheep sheep sheep sheep sheep sheep sheep
4
shape buffalo ram goat
输出样例:
Case 1:This list contains 1 sheep
Case 2:This list contains 3 sheep.
Case 3:This list contains 10 sheep
Case 4:This list contains 0 sheep
题目来源:
TO]2001,East Central North America 2000
Practice http://acm.tju.edu.cn/toj/showp2001.html
link
参考代码

#include<iostream>
#include<string>
using namespace std;
int main() {
   
   
   int n, m, c = 1, count;//设出参数
   string str;
   cin >> n;//输入数据个数
   while (n--)  //进入循环
   {
   
   
   	if (c > 1) {
   
   
   		cout << endl;//如果输出的样例多于一个,那么就每相邻的两组输出之间加一个空行。
   	}
   	cin >> m;
   	count = 0;
   	for (int i = 0; i < m; i++) {
   
   
   		cin >> str; //以空格(或换行符)为单词的分隔符
   		if (str == "sheep") count++;
   	}
   	cout << "Case" << c++ << ": This list contains " << count << " sheep." << endl;
   }
   return 0;
}

注意其中的输入str时,每当输入空格时str的输入就结束了,可以借助这一点对每一组中的每一个数据进行遍历。
【例1-2】Poker Hands.
题目描述:
题目要求比较两副扑克牌的大小,其中每副扑克牌由5张牌组成。每行输人包含10张牌即两副牌,输出哪副牌更大,或者两副牌一样大。牌的大小定义为:
(1)Highcard:根据牌从大到小的顺序依次比较。
(2)Pair:有一个对子和3张其他牌,先比较对子的大小,再比较其他牌。
(3)Two pairs:有两个对子和1张其他牌,从大到小比较对子的大小,再比较其他牌。
(4)Three ofa kind:有3张面值相同的牌,比较这个值。
(5)Straight:5张牌连续,比较最大的牌。
(6)Flush:5张牌花色相同,根据牌从小到大的顺序依次比较。
(7)Full house:有3张面值相同的牌和一个对子,比较3个值相同的牌的大小。
(8)Four ofakind;有4张牌面值相同,比较这个值。
(9)Straightflush:5张牌花色相同且面值连续,比较面值最大的牌
如果两副牌种类不同,则按照以上描述,编号大的那副牌更大;如果种类相同,则按照定义判断大小。
牌的花色有 C(clubs)、D(diamonds)、H(Hearts)、S(spades)4种,面值有 2、3、4、5、67、8、9、T、J、Q、KA共13种。每张牌用面值和花色来表示
输入样例:
2H 3D 5S 9C KD 2C 3H 4S 8CAH
2H 4S 4C 2D 4H 2S 8S AS QS 3S
2H 3D 5S 9C KD 2C 3H 4S 8C KH
2H 3D 5S 9C KD 2D 3H 5C 9S KH
输出样例:
White wins
Black wins.
Black wins.
Tie.
题目来源:
TOJ 1290,Waterloo Local Contest Jun. 6,1998
http://acm.tju.edu.cn/toj/showp.php?pid=1290
链接: link
参考代码

#include<iostream>
#include<algorithm>
using namespace std;
class Poker //表示扑克牌的类
{
   
   
public:
	int num, suit;//面值和花色
	Poker(int a = 0, int b = 0) {
   
   
		num = a, suit = b;
	}
	bool operator< (const Poker P) const {
   
   
		//比较函数
		if (num == P.num) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值