![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【暴力/模拟/水题】
张松超
这个作者很懒,什么都没留下…
展开
-
UVA ~ 12096 ~ The SetStack Computer (模拟,statck + map + set + vector)
题意:有一个专门为了集合运算而设计的“集合栈”计算机。该机器有一个开始为空的栈并且支持以下操作。1.PUSH:空集“{}”入栈。2.DUP:把当前栈顶元素复制一份后在入栈。3.UNION:出栈两个集合,然后把二者的并集入栈。4.INTERSECT:出栈两个集合,然后把二者的交集入栈。5.ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈。例如,栈顶原创 2018-01-01 20:12:18 · 231 阅读 · 0 评论 -
UVA ~ 540 ~ Team Queue (queue + queue + map)
题意:有t个团队的人正在排一个长队。每次新来一个人时,如果他有队友在排队,那么这个新人会插队到最后一个队友身后。如果没有任何一个队友排队,则他会排到长队的队尾。输入每个团队中所有队员的编号,要求支持如下3种指令(前两种指令可以穿插进行)。ENQUEUE:编号为X的人进入长队。DEQUEUE:长队队首出队。STOP:停止模拟。对于每个DEQUEUE指令,输出出队的人的编号。思原创 2018-01-02 09:48:40 · 271 阅读 · 0 评论 -
UVA ~ 136 ~ Ugly Numbers (priority_queue + map)
题意:丑数是指不能被2,3,5以外的其他素数整除的数。把丑数从小到大排列起来,结果如下:1,2,3,4,5,6,8,9,10,12,15……求第1500个丑数。思路:用优先队列存储,用set判断有没有出现过。#includeusing namespace std;typedef long long LL;int main(){ priority_queue, gre原创 2018-01-02 10:45:41 · 249 阅读 · 0 评论 -
UVA ~ 400 ~ Unix ls (模拟)
题意:输入正整数n(1思路:排个序。然后计算行数和列数。输出的时候我们按行输出的话很简单,但是这个题要按列输出,我们可以发现按列输出也是有规律的,即假设要输出r行的第c个元素他在数组中的位置应该为c * rows + r,注意要判断是否越界(即>=n)。#includeusing namespace std;const int maxn = 100 + 5;const int maxcol原创 2018-01-02 15:12:17 · 296 阅读 · 0 评论 -
UVA ~ 1592 ~ Database (枚举 + map + pair)
题意:输入一个n行m列的数据库(1≤n≤10000,1≤m≤10),是否存在两个不同行r1,r2和两个不同列c1,c2,使得这两行和这两列相同(即(r1,c1)和(r2,c1),(r1,c2)和(r2,c2)相同)。思路:我们先把每个字符串用map映射成一个数字,用数组存起来。然后枚举r1,r2,c1,c2明显超时。我们可以枚举c1和c2,然后对于每一行r,把c1,c2的内容用pair放入ma原创 2018-01-02 20:14:08 · 386 阅读 · 0 评论 -
POJ ~ 3279 ~ Fliptile(二进制枚举+模拟递推)
题意:给你一个n*m的黑白棋盘,问能否通过操作使得棋盘全变为白色。如果有求一种操作次数最少的方法(相同时要求字典序最小),没有输出"IMPOSSIBLE"。操作为:将某一块和它上下左右全部翻转。思路:由于我们每次反转都会影响到上面的棋子,我们想全变为白色,我们需要从第二行到第n行每一行把它的上一行的黑色块翻转为白色,如果最后一行把上一行的翻转为白色之后最后一行还有黑色块,证明这种方法不能将棋盘全变...原创 2017-12-23 21:10:52 · 440 阅读 · 0 评论 -
POJ ~ 3087 ~ Shuffle'm Up(set+模拟)
题意:给你两堆牌s1,s2,牌数均为C,按照指定规则互相交叉组合为一堆牌s12,再将s12下面的C张牌归为s1,剩下的为s2。依次循环,问是否能达到制定状态ans。思路:模拟。每次出现过的状态放入set,一直按照规则变化即可,如果某种出现过的状态又出现了那么下面变化肯定都一样形成循环,就不可能有答案。//#include#include#include#include#includ原创 2017-12-25 10:23:09 · 286 阅读 · 0 评论 -
codeforces 903C. Boxes Packing(模拟)
题意:现在有N个立方体盒子,你现在可以把这些盒子套起来(一个盒子的尺寸严格小于另一个盒子),问最少能看到多少个盒子?思路:模拟。排个序依次往没用过的最大的盒子里面放就行。#includeusing namespace std;const int MAXN = 5e3 + 5;int n, a[MAXN];bool vis[MAXN];int main(){ while(~sc原创 2017-12-20 21:17:16 · 472 阅读 · 0 评论 -
codeforces 903B. The Modcrab(模拟)
题意:一个人在打怪,他每回合可以选择喝药加血或者打怪,然后怪物会攻击他一次,让你输出一个他可以打死怪物的方案(任意一个即可,特殊判定),但是注意他的血量可以无上限。第一行输入他的当前血量h1,攻击力a1,药每次回复c的血量,第二行输入怪物的血量h2,怪物的攻击力a2。思路:因为血量无上限,所以我们可以先把血加到一个刚好能打死怪物的血量,然后再开始打怪。加血的时候怪也会攻击你。我因为这个WA原创 2017-12-20 20:06:39 · 581 阅读 · 0 评论 -
codeforces 898B. Proper Nutrition(暴力+思维)
题意:给你n问有没有两个正整数x,y满足x·a + y·b = n。思路:暴力枚举x,判断有没有整数y使式子成立。#includeusing namespace std;int main(){ int n,a,b; while(~scanf("%d%d%d",&n,&a,&b)) { bool flag = false; for(int i = 0; i * a <=原创 2017-12-20 19:49:26 · 807 阅读 · 0 评论 -
codeforces 903A.Hungry Student Problem(水,暴力)
题意:T次询问,每次问有没有两个非负整数x,y使得3*x + 7*y = n。思路:因为数据范围很小直接暴力就可以。#includeusing namespace std;int main(){ int T,n; scanf("%d",&T); while(T--) { scanf("%d",&n); bool flag = false;原创 2017-12-20 20:02:18 · 578 阅读 · 0 评论 -
codeforces 898C. Phone Numbers(模拟+map,set,vector)
题意:N表示下面有N个字符串,每个字符串第一个表示名字,第二个表示后面有几个电话号,后面是这几个电话号(电话号允许有前导0),(name ,number_of_phone_numbers,phone_numbers)中间都用空格隔开。现在需要你帮他整理这些电话号,当一个字符串为另一个字符串的后缀或相同时,那么我们删除这个电话号。输出整理后的这些。(题意不是很好理解,结合样例理解好点)思路:原创 2017-12-20 18:52:54 · 653 阅读 · 0 评论 -
codeforces 900B. Position in Fraction(暴力+模拟)
题意:分数A/B的小数点后第几位为C。思路:暴力模拟前300位就能AC。感觉这个题有点坑,如果循环节很长怎么办。总感觉不有点不严谨。#includeusing namespace std;const int MAXN = 300;//看完数据发现215就能过 int main(){ int a, b, c; while(~scanf("%d%d%d",&a,&b,&c))原创 2017-12-12 15:31:12 · 724 阅读 · 0 评论 -
codeforces 900A. Find Extra One(水)
题意:给你N个点,问能否通过去除一个点使得所有点都在Y轴的同侧。思路:统计Y轴左边和右边点的个数,较小的那个大于2就是NO。#includeusing namespace std;const int MAXN = 1e5 + 5;int main(){ int n; while(~scanf("%d",&n)) { int l = 0, r = 0; for(int原创 2017-12-12 15:22:05 · 345 阅读 · 0 评论 -
codeforces 887A. Div. 64(暴力)
题意:给一个二进制数字,问你能否通过移除某些数字使得剩下的数字整除64思路:64的二进制为1000000,这个数字如果在某个1后面有六个0,那么这个数字通过变化一定能变为1000000(即64)整除64.#includeusing namespace std;int main(){ string s; while(cin>>s) { int len = s.length()原创 2017-12-10 00:09:55 · 289 阅读 · 0 评论 -
codeforces 890B. Vlad and Cafes(set+模拟)
题意:给你一个N表示Vlad最近去过N次咖啡馆,下面第i个数表示他倒数第N - i次去的咖啡馆的编号。问他最后一次去过哪个咖啡馆的时间最早(就是我最长时间没去过的咖啡馆是哪个)?题意:用set插入,然后从后往前删除,直到只剩下一个元素的时候就是答案。#includeusing namespace std;const int MAXN = 2e5 + 5;int n,a[MAXN];原创 2017-12-08 00:08:01 · 341 阅读 · 0 评论 -
codeforces 893A. Chess For Three(模拟)
题意:Alex, Bob and Carl,三个人想一起游戏,但是每局游戏只能两个人玩,于是他们决定谁输了就换另一个人玩,我们用1表示Alex,2表示Bob,3表示Carl。给一个N表示他们完了N局游戏,下面N个数字表示当前局获胜的人,下面的日志描述的情况是可能的输出YES,否则输出NO。思路:模拟即可。用p1,p2表示当前在玩游戏的人,那么剩下那个人编号为6 - p1 - p2。#i原创 2017-12-05 20:01:17 · 289 阅读 · 0 评论 -
NSWOJ ~ 1100 ~ —种排序(结构体排序)
题目网址:NSWOJ-1100一种排序1100 - 一种排序时间限制:3秒 内存限制:128兆题目描述现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);1.按照编号从小到大排序2.对于编号相等的长方形,按照长方形的长排序;原创 2017-04-04 21:14:44 · 474 阅读 · 0 评论 -
HDU ~ 1394 ~ Minimum Inversion Number(暴力||归并排序||线段树||树状数组)
题目网址:Minimum Inversion NumberMinimum Inversion NumberTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Problem DescriptionThe inversion number of a given number sequen...原创 2017-07-23 10:31:22 · 439 阅读 · 0 评论 -
UVA ~ 1596 ~ Bug Hunt (字符串处理 + map)
题意:输入并模拟执行一段程序,输出第一个BUG所在的行。每行程序有两种可能:1.数组定义,格式为arr[size]。例如a[10]或者b[5],可用下标分别是0~9和0~4.定义之后所有元素均为未初始化状态。2.赋值语句,格式为arr[index] = value。例如a[0] = 3或者a[a[0]] = a[1].定义语句保证正确,赋值语句可能会出现两种bug:下标index越界;原创 2018-01-12 20:34:41 · 416 阅读 · 0 评论 -
UVA ~ 156 ~ Ananagrams(map+字符串处理)
题意:输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词。再判断是否满足条件时,字母不分大小写,但在输出时应保留输入中的大小写,按字典序进行排列(所有大写字母在所有小写字母前面)。思路:把每个单词“标准化”,即全部转化为小写字母后再排序,然后放入map中统计个数。同时所有单词用vector存起来,输出的时候判断该单词“标准化”后的个数,如果为一就输出原创 2017-12-28 21:54:11 · 421 阅读 · 0 评论 -
UVA ~ 10815 ~ Andy's First Dictionary(set+字符串处理)
题意:现在给你一篇XY学长今天要读的文章,请你写一个程序,输出他都学习到了哪些单词。要求:如果文章中有相同的单词,那么仅仅输出一次;而且如果两个单词只有大小写不同,将他们视为相同的单词。输入一篇文章每组数据以EOF结束。思路:用set存单词,先把所有非字母的字符转化为空格,然后用stringstream得到每个单词。#includeusing namespace std;int mai原创 2017-12-28 21:03:30 · 362 阅读 · 0 评论 -
UVA ~ 101 ~ The Blocks Problem(vector+模拟)
题意:从左到右有n个木块,编号为0 ~ n-1,要求模拟一下4种操作(下面的a和b都是木块编号)。1.move a onto b:把a和b上方的木块全部归位,然后把a摞到b上面2.move a over b:把a 上方的木块全部归位,然后把a摞到b上面3.pile a onto b: 把b 上方的木块全部归位,然后把a摞到b上面4.pile a onto b:原创 2017-12-28 16:05:53 · 286 阅读 · 0 评论 -
UVA ~ 1597 ~ Searching the Web (模拟,map+bitset)
题意:输入n篇文章和m个请求(n 1.A:查找包含关键字A的文章。(即如果某篇文章中含有A,输出含有A的行)2.A AND B:查找同时包含关键字A和B的文章。(即如果某篇文章中含有A和B,输出含有A的行,或含有B的行)3.A OR B:查找包含关键字A或B的文章。(即如果某篇文章中含有A或B,输出含有A的行,或含有B的行)4.NOT A:查找不包含关键字A的文章。(即如果某篇文章原创 2018-01-14 18:45:39 · 338 阅读 · 0 评论 -
UVA ~ 814 ~ The Letter Carrier's Rounds (模拟 + map + set + vector)
题意:MTA意思是城市代理什么的。每个MTA会有一些用户。你把信息发到MTA,他会自动帮你转发给MTA里你需要发送的所有人。先输入MTA和它对应的用户,以"*"结束。然后输入一些请求,以"*"结束。请求格式为:一堆"用户名@城市",第一个人(即发件人)要给后面所有的人(即收件人)发消息,以"*"结束。再输入要发送的消息以"*"结束。对于每个请求,发件人会按照城市出现的顺序,把自己的原创 2018-01-04 21:50:08 · 363 阅读 · 0 评论 -
codeforces 887B. Cubes for Masha(暴力+set or DFS)
题意:给你n行数字,每行6个数,问你从每一行中挑一个数字,能组成1~X所有的数字的最大X为多少?思路:这个X肯定小于99,因为要组成99肯定要先组成11,22,33,44,55,66,77,88,在加上0这个数字,现在已经有17个数字了如果还能组成99就大于18个数字了(3*6)了。我们暴力把这些所有能组成的数字放入set然后从1-99判断看哪个数字没有,输出答案即可。还有一种方法直接跑一原创 2017-12-10 01:15:54 · 402 阅读 · 0 评论 -
UVA ~ 1593 ~ Alignment of Code (vector+模拟)
题意:输入若干行代码,要求各列单词的左边界对其且尽量靠左。单词之间最少要空一格,每个单词不超80个字符,每行不超过180个字符,一共最多1000行。思路:每行用一个vector存一下,存的时候维护一下每一列单词长度的最大值。#includeusing namespace std;const int MAXN = 1000 + 5;vector v[MAXN];//每列的单词int原创 2018-01-07 20:41:00 · 277 阅读 · 0 评论 -
UVA ~ 1594 ~ Ducci Sequence (模拟,set + vector)
题意:对于一个n元组,可以对于每个数求出它和下一个数的差的绝对值,得到一个新的n元组。重复这个过程,得到的序列成为Ducci序列,例如:(8, 11, 2, 7) → (3, 9, 5, 1) → (6, 4, 4, 2) → (2, 0, 2, 4) → (2, 2, 2, 2) → (0, 0, 0, 0)。有的Ducci序列最终会陷入循环,有Ducci序列会变成0。输入n元组(3原创 2018-01-07 21:38:10 · 323 阅读 · 0 评论 -
UVA ~ 10935 ~ Throwing cards away I (vector模拟)
题意:桌上有n(n例如:n==7时,操作如下(1 2 3 4 5 6 7)->(3 4 5 6 7 2)->(5 6 7 2 4)->(7 2 4 6)->(4 6 2)->(2 6)->6思路:vector模拟。#includeusing namespace std;int main(){ int n; while (~scanf("%d", &n) && n)原创 2018-01-08 09:00:21 · 217 阅读 · 0 评论 -
UVA ~ 10763 ~ Foreign Exchange (map模拟)
题意:有n(n思路:用map保存这个学校需要交换出去多少人?#includeusing namespace std;int main(){ int n; while (~scanf("%d", &n) && n) { map M; while (n--) { int a, b;原创 2018-01-08 09:58:26 · 239 阅读 · 0 评论 -
UVA ~ 10391 ~ Compound Words (set + 暴力)
题意:给出一个词典,找出所有复合词,即恰好要两个单词组成的单词。输入每行都是一个由小写字母组成的单词。输入已按照字典序从小到大排序,且不超过120000个单词。输出所有复合词,按照字典序从小到大排序。思路:把所有单词放入set中,然后遍历set容器,暴力判断单词是否能由其他两个单词组成。#includeusing namespace std;set s;bool judge(stri原创 2018-01-08 10:38:45 · 244 阅读 · 0 评论 -
UVA ~ 1595 ~ Symmetry (暴力 or set)
题意:给出平面上N(N思路:把这些点存一下。如果存在,那么x * 2 =(最左边点的x坐标 + 最右边点的x坐标),然后判断每一个点的对称点是否存在即可(暴力遍历,或者用set的判重函数都行)。#includeusing namespace std;int n;int main(){ int T; scanf("%d", &T); while (T--)原创 2018-01-08 14:11:58 · 313 阅读 · 0 评论 -
UVA ~ 12100 ~ Printer Queue (队列 + 优先队列)
题意:学生会里只有一台打印机,但是由很多文件需要打印,因此打印任务不可避免地需要等待。有些打印任务比较急,有些不那么急,所以每个任务都有一个1~9间的优先级,优先级越高表示任务越急。打印机运作方式为:首先从打印队列中取出一个任务J,如果队列里有比J更急的任务,则直接把J放到打印队列尾部,否则打印任务J。输入打印队列中各个任务的优先级以及所关注的任务在队列中的位置(队首位置为0),输出该任务完成的时原创 2018-01-10 10:51:31 · 530 阅读 · 0 评论 -
UVA ~ 230 ~ Borrowers (set,map,string)
题意:你的任务是模拟一个图书管理系统。首先输入若干图书的标题和作者(标题各不相同,格式为:(“书名” by 作者. ),以END结束),然后是若干指令:BORROW指令表示借书,RETURN指令表示还书,SHELVE指令表示吧所有已归还还未上架的图书排序后一次插入的书架并输出图书标题和插入位置(可能是第一本书或者某本输的后面),每个SHELVE指令结束输出一个"END"。图书排序的方法是先按照作者原创 2018-01-10 20:32:42 · 346 阅读 · 0 评论 -
PAT ~ L2-005. 集合相似度 (set)
思路:直接利用algorithm库中的集合的交操作即可。并集元素个数的等于两个集合元素个数相加 - 交集元素个数。但是注意不能在直接求并集了,太浪费时间,会超时。不知道集合的交并补差对应的函数的,可以参考我之前的一篇博客set相关,在中间那一部分#include<bits/stdc++.h>using namespace std;const int MAXN = 55;#defi...原创 2018-03-13 22:03:16 · 305 阅读 · 0 评论 -
PAT ~ L2-009. 抢红包 (模拟,结构体排序)
思路:开一个结构体数组去统计每个人(+收到/-发出)的红包,每个人的编号,每个人抢到的红包数量,然后按要求排序输出即可。#include <bits/stdc++.h>using namespace std;const int MAXN = 1e4 + 5;int N, k, n;double p, sum;struct People{ double money;...原创 2018-03-20 20:16:25 · 283 阅读 · 0 评论 -
POJ ~ 1753 ~ Flip Game (二进制枚举 + 模拟)
题意:给你一个4*4的棋盘,'w'表示白子,'b'表示黑子。每次可以将一颗棋子及他的上下左右变为相反的颜色,通过这种操作,我们要把所有的子全变成一个颜色,问最小步数。如果不能将所有的子变成一个颜色输出"Impossible"。思路:该题和 POJ ~ 3279 ~ Fliptile(二进制枚举+模拟递推)基本一样。只不过本题全部变为黑色或者白色均可以。我们可以用0和1来表示黑白,方便后面翻转操作。...原创 2018-04-08 20:43:33 · 345 阅读 · 0 评论 -
POJ ~ 1573 ~ Robot Motion (模拟)
题意:输入N,M,S。表示有一个n*m的地图,机器人从第1行的第S位置进入,每个格子中会有一个指令方向,机器人会按照指令走一格。如果机器人走出地图输出:“%d step(s) to exit”,如果机器人陷入一个循环输出:“%d step(s) before a loop of %d step(s)”表示第几步开始陷入了这个循环和这个循环的大小。思路:直接模拟就行了,搜索写也可以。开一个标记数组表...原创 2018-04-08 20:53:16 · 221 阅读 · 0 评论 -
POJ ~ 1068 ~ Parencodings (规律 + 模拟)
题意:T组测试数据,然后给你n,给你P序列让你求W序列。P[i]的意义是的在第i个右括号前面有多少个左括号,w[i]的意义是,在第i个右括号和与他匹配的左括号中有多少个括号,包括自己。思路:先通过P序列重建括号序列。规律:第i+p[i]位置一定是右括号,剩下的都是左括号。总长度为2*n。然后与第i个右括匹配的左括号一定是在他左边第一个没跟其他右括号匹配过的右括号,开个标记数组去维护即可,过程中查一...原创 2018-04-09 15:16:14 · 191 阅读 · 0 评论 -
51Nod ~ 1770 ~ 数数字 (模拟 + 找循环节)
思路:可以发现一定会出现循环节。模拟乘法过程,如果出现了循环节就结束,但是注意如果最后一位还要进位的话,要判断答案是否还要+1。#include <bits/stdc++.h>using namespace std;int a, b, d, n;int main(){ int T;scanf("%d", &T); while (T--) { ...原创 2018-04-14 21:52:41 · 242 阅读 · 0 评论