基础练习
youth.lin
a tyro at CS and NLP.
展开
-
《算法竞赛入门经典》习题2-5 分数化小数(Decimal)
原题 题意:输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。其中a,b ≤ 106, c≤100。输入包含多组数据,结束标记为a=b=c=0。 测试数据: 样例输入: 1 6 4 0 0 0 样例输出: Case 1: 0.1667解题思路这道题是整数取整、取余的练习题。本以为可以直接用C++的setprecision(c)解原创 2017-04-08 20:26:25 · 2736 阅读 · 3 评论 -
PAT 1001 A+B Format(格式化输出)
原题地址https://www.patest.cn/contests/pat-a-practise/1001 输出标准化后的a+b,标准化是指每3个数位之间有一个逗号分隔。如-1000000+9 = -999,991。解题思路控制输出格式的水题,用变量comma控制以3为周期的逗号加入。注意数值的正负,以及避免开头输出逗号。AC代码#include <iostream>#include <c原创 2017-05-10 15:41:47 · 893 阅读 · 0 评论 -
PAT 1002 A+B for Polynomials(简单计数)
原题地址https://www.patest.cn/contests/pat-a-practise/1002 给出两个多项式的指数和系数(没有给出基数),将指数相同的多项式进行系数相加并输出每一项的系数和指数。 如a=2.4x1+3.2x0,b=1.5x2+0.5x1,因此a+b = 1.5x2+2.9x1+3.2x0 解题思路用数组poly[exp]表示指数为exp的项前面的系数,输入原创 2017-05-10 15:42:48 · 212 阅读 · 0 评论 -
PAT 1005 Spell It Right(简单输出)
原题地址https://www.patest.cn/contests/pat-a-practise/1005 以英文单词形式,输出长整数的各数位之和的每一位。解题思路对输入的每一位累加后,用常量字符串数组控制sum的每一位输出即可。AC代码#include <iostream>#include <cstring>using namespace std;const int maxn = 1原创 2017-05-10 16:02:50 · 321 阅读 · 3 评论 -
PAT 1006 Sign In and Sign Out(简单排序)
原题地址https://www.patest.cn/contests/pat-a-practise/1006 题意:给出每个职员进入公司和离开公司的时间,筛选出最早开门和最迟关门的职员编号。解题思路在结构体中用六个整数分别存放入、出时间的整数值即HH:MM:SS(用控制位宽的方式读入),再对入、出时间分别做排序即可。AC代码#include <iostream>#include <cstdi原创 2017-05-10 16:20:19 · 386 阅读 · 0 评论 -
PAT 1023 Have Fun with Numbers(简单计数+大整数)
题目https://www.patest.cn/contests/pat-a-practise/1023 题意:输入一串不超过20位的数字,将该数字串乘以两倍后,判断新数串是否为原数串的一个排列。解题思路统计旧字符串中数字0-9的出现次数和新字符串中数字0-9的出现次数,若两者完全相同,则新数串是原数串的一个排列。AC代码#include <iostream>#include <cstrin原创 2017-06-16 15:19:02 · 246 阅读 · 0 评论 -
PAT 1019 General Palindromic Number(进制水题)
题目https://www.patest.cn/contests/pat-a-practise/1019 题意:判断将数字N转换到base进制下以后是否满足回文。解题思路进制转换的水题,只需模拟短除法将n转换到base进制下,每次短除法的余数都push到vector里,判断vector中对应位置的元素是否相同。判断回文的方法是两端的下标从首尾往中间走。刚开始由于循环条件写成了 i != las原创 2017-06-06 22:16:42 · 462 阅读 · 0 评论 -
EOJ 1082 Easy to AC(枚举+二进制子集法)
判断 非负整数n (n<=1 000 000)能否表示为各不相同的非负数字的阶乘之和,比如9 = 1!+2!+3!原创 2017-09-09 11:00:20 · 407 阅读 · 0 评论 -
EOJ 3292 解密字符串(排序)
题目 题意:为防止泄密,将数码0到9用全大写的英文单词表示并将所有字母打乱。密码114表示为ONEONEFOUR,或OURNEONFOE,FOOONNEERU等。 给定一个大写字母表示的字符串,要求算出原来的数字表示的密码(非递减)。解题思路 0-9对应的大写英文单词: ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT,原创 2017-09-09 15:50:54 · 507 阅读 · 0 评论 -
EOJ 3290 找数(III) (模拟+简单数字串)
题目http://acm.ecnu.edu.cn/problem/3290/ 题意:“非上升数”表示一个整数的高位数码不会小于低位数码。如54332111, 111等。给定一个整数n,找出不小于n的最小“非上升数”。解题思路最自然的想法是,通过扫描s[i] < s[i+1]找到上升点,然后对上升点前的s[i-1]+1,后面全部填0。但是要考虑到s[i-1]+1后可能会破坏前面的非上升序列,因此原创 2017-09-09 17:11:14 · 530 阅读 · 0 评论 -
EOJ 3276 连续正整数之和(模拟)
题目http://acm.ecnu.edu.cn/problem/3276/ 题意:给定一个正整数 N,判断其是否可以表示为一组连续正整数的和,输出符合条件的解的组数。如15=1+2+3+4+5=4+5+6=7+8,组数为3.解题思路设连续整数的起始数为i,连续个数为k,那么n=i+(i+1)+(i+2)...(i+k−1)2=(2∗i+k−1)∗k2n =\frac {i+(i+1)+(i+原创 2017-09-10 17:39:52 · 852 阅读 · 0 评论 -
EOJ 3264 蚂蚁(模拟+栈)
题目http://acm.ecnu.edu.cn/problem/3264/ 题意:水平线上有 N 只蚂蚁,每只蚂蚁的位置及大小均不同。他们沿着 X 轴爬行,有的向左,有的向右,爬行的速度是一样的,两只蚂蚁相遇大一点的会吃掉小的。 现在从左到右给出每只蚂蚁的大小和爬行的方向(0 表示向左,1 表示向右)。问足够长的时间之后,能剩下多少只蚂蚁?解题思路比较简单的模拟题。注意到输入是从左原创 2017-09-11 09:41:31 · 498 阅读 · 0 评论 -
EOJ 3036 按数据中1的位数排序(位运算+排序)
题目http://acm.ecnu.edu.cn/problem/3036/ 题意:输入n个数,按照 64 位二进制补码表示中 1 的位数从大到小进行排序。若两个数的二进制表示中 1 的位数相同,则按照数本身值由小到大排序。解题思路实质是求二进制表示中1的个数。利用位运算来实现,每次将n和n-1做与运算,即把n二进制表示中最右边的1去掉。重复操作直到n变为0,操作次数即二进制中1的个数。AC代原创 2017-09-11 15:18:59 · 727 阅读 · 0 评论 -
EOJ 3124 单词表(排序)
题目http://acm.ecnu.edu.cn/problem/3124/ 提取英文文本中的单词,重复出现的单词只取一个,把它们按照字典顺序排序,建立为一个单词表。 注意:单词与单词之间用空格或标点符号(逗号 (,),句号 (.), 惊叹号 (!), 问号 (?))分隔;提取的单词只包含 26 个英文字符。解题思路用C++做可能比较麻烦,直接上python的re模块。re.split(原创 2017-09-11 17:54:35 · 877 阅读 · 0 评论 -
EOJ 3239 最长的等差数列(排序+枚举)
题目http://acm.ecnu.edu.cn/problem/3239/ 题意: 给定n (1≤n≤100) 个数,从中找出尽可能多的数使得他们能够组成一个最长的等差数列。输出该最长等差数列的长度。 注意:当n=1时,构成长度为1的等差数列。解题思路由于这些数字不一定要连续,所以先对所有数字排序,便于后续比较大小和选取递增的序列。用以下几个变量维护一个等差数列:i 记原创 2017-09-11 19:36:58 · 667 阅读 · 0 评论 -
PAT 1012 The Best Rank(简单统计)
原题https://www.patest.cn/contests/pat-a-practise/1012 给出每个学生在三门科目中的成绩(可以计算出平均分),求每个学生的最高排名和对应科目(三门科目or平均分的排名)解题思路刚开始看题以为需要排序来做,但是由于四门科目都要统计排名,因此用排序来做反而增加了复杂度,所以下面的遍历都是最粗暴的查找。数据结构:为每个学生构造结构体,记录id、这四门科原创 2017-05-18 22:16:28 · 586 阅读 · 1 评论 -
POJ 1852 Ants(模拟+弹性碰撞)
原题地址http://poj.org/problem?id=1852 题意:在一根长为L厘米的水平木棍上有n只蚂蚁,它们以每秒1cm/s的速度走到木棍一端就会掉下去。现在知道它们起始位置(相对于木棍左端点的距离)。但是不知道它们爬行的方向。两只蚂蚁相遇后,它们会掉头往反方向走。求所有蚂蚁都落下木棍的最短时间和最长时间。解题思路如果采用穷举搜索的办法枚举所有蚂蚁的初始朝向,那么复杂度为O(2^n原创 2017-04-27 17:53:46 · 668 阅读 · 0 评论 -
《算法竞赛入门经典》习题2-6 三位数排列
原题 题意:用1,2,3,……9组成3个三位数 abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。 按照”abc def ghi”的格式输出所有解,每行一个解。解题思路这道题也是整数拆分、取整取余问题的基础练习。关键信息在于“比例=1:2:3”和“都使用一次”。用visit数组标记每个数字是否出现过枚举(abc, def, ghi)可能的取值,将a原创 2017-04-08 21:22:41 · 2756 阅读 · 2 评论 -
UVa 1583 Digit Generator(枚举+打表)
原题地址https://vjudge.net/problem/UVA-1583 定义数字x加上x的各位数字之和得到y,称x是y的生成元。一个数可能存在多个生成元,求给定数字n最小的生成元。解题思路这道题的题意很清楚,也很简单。需要注意的是通过打表做预处理,事先计算好每个数字的最小生成元。通过遍历1-100000内的所有数字,计算它作为生成元可能构成的大数并标记之。由于遍历是从小到大的,所以如果原创 2017-04-10 22:10:29 · 261 阅读 · 0 评论 -
UVa 401 Palindromes(常量数组+遍历)
原题地址https://vjudge.net/problem/UVA-401 题意:判断输入的字符串是否满足回文、镜像。 回文即从左往右读和从右往左读的序列一样,镜像即可以通过翻转规则从一个字符变成另一个字符,如(3,E),(J-L)等。 解题思路本题是《算法竞赛入门经典》的例题3-3,题目很简单,值得注意的是常量数组的妙用。判断回文串很简单,只要遍历字符串,判断字符str[i]原创 2017-04-10 20:14:10 · 367 阅读 · 0 评论 -
UVa Master-Mind Hints(猜数字+计数)
原题地址https://vjudge.net/problem/UVA-340 题意:猜数字游戏。给定答案序列和猜测序列,统计有多少数字正确(A),多少数字在两个序列中都出现过但位置不对应(B)。解题思路本题是《算法竞赛入门经典》的例题3-4,原题的英文题目很复杂,但是玩过猜数字的都知道是什么意思 :)猜测不限次数,输入0 0 0 0结束这轮猜测;判断A非常简单,直接统计guess[i] =原创 2017-04-10 21:21:08 · 1719 阅读 · 0 评论 -
UVa 1585 Score / 1586 Molar Mass(遍历+计数)
原题地址https://vjudge.net/problem/UVA-1585 题意:给定由O和X组成的串,统计得分。每个O的得分为目前连续出现的O的个数,X得分为0,如OOXXOXXOOO=1+2+0+0+1+0+0+1+2+3=10。解题思路本题是《算法竞赛入门经典》的习题3-1,大水题。遍历输入字符串,用seq记录目前连续出现的O的个数,seq=0代表没有遇到O。遇到O则按照规则累加,遇原创 2017-04-11 19:50:01 · 397 阅读 · 0 评论 -
UVa 1584 Circular Sequence / 455 Periodic Strings(枚举字符串)
原题地址https://vjudge.net/problem/UVA-1584 题意:DNA的四个字母CGAT排列成环形,可以移动起点,输出字典序最小的环形序列(顺时针)。解题思路这道题是《算法竞赛入门经典》的例题3-6,是一道水题。给定两个起始位置,函数needSwap完成以下任务:遍历这两个起始位置开始的环形序列中的每个字符,如果在某个字符上,新起点比之前维护的起点min_index的字典原创 2017-04-11 19:23:21 · 269 阅读 · 0 评论 -
UVa 227 Puzzle(小心输入输出!)
原题地址https://vjudge.net/problem/UVA-227 题意如图 解题思路本题是《算法竞赛入门经典》的习题3-5,题目本身非常简单,但是设了很多坑爹的陷阱,包括数据的输入、指令的输入、结果的输出,估计就是它主要的考点。根据每个指令决定移动哪个行列位置的格子,当要移动的某个格子越界时则该指令非法。总结一下我踩过的坑:输入: 由于该二维字符数组含空格,而 scan原创 2017-04-12 21:04:05 · 1866 阅读 · 3 评论 -
UVa 232 Crossword Answers(枚举+输入输出)
原题地址https://vjudge.net/problem/UVA-232 题意:输入r行c列的网格,黑格用 ‘*’ 表示, 每个白格上都填有一个字母。如果一个白格的左邻或上邻位置没有白格(黑格或越界),则称该白格是一个起始格。 首先将所有起始格按照从上到下,从左到右的顺序编号1,2,3…… 接下来找出所有的横向单词(从一个无左邻的起始格开始,向右延伸至黑格或边界),再找出所有的纵原创 2017-04-13 14:36:29 · 343 阅读 · 0 评论 -
UVa 202 Repeating Decimals(模拟+哈希)
原题地址https://vjudge.net/problem/UVA-202 给出两个数n,m,0<=n,m<=3000,输出n/m的循环小数表示以及循环节长度。解题思路本题是《算法竞赛入门经典》的习题3-7,思路容易想到,实现起来有些细节和边界需要考虑。不难想到,小数点后循环节的产生是因为计算时的某个余数重复出现,这之后的计算会重复上一次这个余数出现时直到当前位置的结果。因此关键在于找到这个原创 2017-04-13 23:09:23 · 314 阅读 · 0 评论 -
PAT 1007 Maximum Subsequence Sum(最大子串和)
原题地址https://www.patest.cn/contests/pat-a-practise/1007 求出给定数字串的最大子串和,以及这个最大子串和的首尾元素。(若有多个最大子串则取最靠左的那个)解题思路本题基本上是最大子串和的裸题,只是增加了一个输出首尾元素的要求。最大子串和描述:输入一个整数序列,求出其中连续子序列和的最大值。最大子串和几种解法:复杂度O(n^3):穷举所有可能原创 2017-05-10 19:03:21 · 1523 阅读 · 0 评论 -
PAT 1008 Elevator(水题)
原题地址https://www.patest.cn/contests/pat-a-practise/1008 题意:给出一组电梯调度的序列,已知上升一层耗时6秒,下降一层耗时4秒,每次停留5秒,求总耗时。解题思路觉得不应该放在PAT甲级题目里,因为实在没有看到考点。直接模拟计数就可以了。AC代码#include <iostream>using namespace std;int main()原创 2017-05-10 19:33:20 · 351 阅读 · 0 评论 -
PAT 1009 Product of Polynomials(简单计数)
原题地址https://www.patest.cn/contests/pat-a-practise/1009 遵循多项式相乘规则,求多项式a+b的乘积。解题思路模拟多项式相乘的过程,需要注意不能用判断是否poly[i]为0来判断i是否在A中出现过,因为poly[i]的值有可能是由之前的相乘产生的,所以标明哪些数在A中出现过,而且用第二个数组存放解。AC代码#include <iostream>原创 2017-05-10 20:16:04 · 447 阅读 · 0 评论 -
UVa 1594 Ducci Sequence(模拟+查重)
原题地址https://vjudge.net/problem/UVA-1594 题意:对一个n元组(a1, a2, … an),可以对于每个数求出它和下一个数的差的绝对值,得到一个新的n元组(|a1-a2|,|a2-a3|…|an-a1|),重复这个过程,得到的序列成为Ducci序列。 例如(8, 11, 2, 7) → (3, 9, 5, 1) → (6, 4, 4, 2) → (2,原创 2017-04-22 22:05:51 · 584 阅读 · 0 评论 -
PAT 1014 Waiting in Line(模拟+队列操作)
题目https://www.patest.cn/contests/pat-a-practise/1014 银行前台处理客户的过程如下,有n个窗口,每个窗口前的队伍可以排m个人,其余人在黄线外等待;每当有人处理完毕时,黄线外的人找最短的、序号最小队伍插入;求每个人的结束时间。解题思路本题是明显的队列的模拟题,遗憾的是改了好久代码只过了四组,最后一组依然是段错误,虽然还不知道什么原因:(,看了一下原创 2017-05-28 10:31:31 · 804 阅读 · 0 评论 -
琐碎BFS/DFS
简单部分和 给定n个数字,能否取出部分数字的和等于k。DFS适合于解决“是否存在解”的问题。复杂度随数据量呈指数级上升,只适合于小数据量。DFS(i, sum)表示处理完前i-1个数以后的和为sum,正要对第i个数处理。对第i个数处理时,要么将s[i]加到sum里,要么跳过这个数,然后继续搜索。 剪枝:当处理到第i个数时已经溢出k,则直接返回false。#include <iostream>原创 2017-06-29 20:25:15 · 209 阅读 · 0 评论