解题报告
董成荣
每天努力一点点,直到永远
展开
-
SDUT 1008最长公共子序列
题目链接https://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/1008.html分析题目类型:变维DP状态定义 对于动态规划而言,最难的地方就在于状态的定义,定义一个良好的状态可以极大的帮助我们解决问题,反之,如果定义一个糟糕的状态尽管这个状态是正确的,也很有可能会...原创 2017-09-24 10:57:02 · 4076 阅读 · 0 评论 -
骰子的游戏(牛客练习赛7)
题目链接 https://www.nowcoder.com/acm/contest/38/A 解题方法 枚举AC代码#include#includeusing namespace std;const int maxn = 10 + 5;int a[maxn],b[maxn];int main(){原创 2017-12-01 22:34:14 · 871 阅读 · 0 评论 -
poj1061青蛙的约会
题目链接 http://poj.org/problem?id=1061题目类型 扩展欧几里得算法解题思路 设青蛙A为速度快的那只,则有(m - n) * t - k * l = y - x 令a = m - n, b = l, c = y -原创 2017-11-29 13:10:31 · 364 阅读 · 0 评论 -
leetcode729. My Calendar I
设一个字典记录所有被预定的页面,然后就是判断区间相交了当发生以下两种情况之一时认为区间相交1、起点小于左端点且终点大于左端点2、起点大于等于左端点且起点小于右端点代码如下class MyCalendar(object): dic = {} def __init__(self): self.dic = {} def book(self, start, end):原创 2017-11-19 17:30:52 · 651 阅读 · 0 评论 -
Cats and Fish2017北京赛区网络同步赛
题目链接:http://hihocoder.com/problemset/problem/1631首先根据吃鱼的速度从小到大排序,然后从1到x按着时间轴枚举猫的行为,如果是吃完一条判断一下他的状态是正在吃鱼还是没有在吃鱼,若正在吃鱼则不完整的鱼p减一同时把状态调整为未吃鱼,否则直接将剩余的完整的鱼-1;若行为是吃鱼未吃完,也即不能整出,再根据猫的状态做相应的调整AC代码:原创 2017-11-19 16:14:14 · 533 阅读 · 0 评论 -
UVA808(对蜂窝建立坐标系)
这个题我是通过建立坐标系加找规律做出来的,个人感觉难点是建立坐标系,所以我将着重讲一下坐标系是怎么建立的建立坐标系:如果你有兴趣的话,你可以将他给的图沿横线延长,这样一个正六边形就会被分为上下两部分,我们在从中间画一条竖线,就会把一个正六边形分为四部分如下图红色的点是原点O,标1的是单位长度为1,2则是单位长度为2(原谅我把图画的这么难看)这就是我们建立的坐标系原创 2017-11-17 21:02:07 · 1564 阅读 · 1 评论 -
Find Pivot Index(LeetCode 724)
本想用贪心结果WA,看来只能老老实实的用枚举了,简单粗暴实用枚举中心轴,从0开始,定义两个变量left 和 right分别代表轴左边的数据之和以及轴右边的数据之和,判断left是否等于right,如果相等返回下标,否则返回-1注意两个地方: 1、枚举的时候不要确定一个轴就定义一个for循环加数,这会很耗时的,我们只需要第一遍计算出left和right,轴从左向右移动时lef原创 2017-11-12 21:04:22 · 1303 阅读 · 0 评论 -
Split Linked List in Parts(LeetCode725)
参加LeetCode weekly contest 58时的一道价值5分的题,是关于数据结构的要求将一个链表均分为k份,如果不能均分(例如链表有6个节点而k=5),则各个部分差不能大于1,链表中允许为空解题思路: 我是先求出链表的长度记为llen,然后llen / k得到每一部分赢至少有几个节点,记为n;然后用llen mod k求出有几个链表需要多加1个节点记为c;剩下的操作原创 2017-11-12 20:49:58 · 633 阅读 · 0 评论 -
AtCoder Regular Contest 085 C题题解
通过给出的样例找出规律如下:设循环的次数为k,则 k = 2 ^ m 设每次循环的花费为c,则 c = (n - m)* 100 + m * 1900故总的运行时间 x = k * c代码如下(因为担心溢出问题,所以我采用的数据类型是long long)#include#includeint main(){ long long n,m; w原创 2017-11-12 20:33:26 · 455 阅读 · 0 评论 -
南阳理工OJ915解题报告
描述Shiva得到了两个只有加号和减号的字符串,字串长度相同。Shiva一次可以把一个加号和它相邻的减号交换。他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串。你现在要去帮助他完成那个这个问题。输入多组测试数据每组数据有两行,每行包含一个由”+”和”-“最成的字符串。每个子符串长度不超过5000。输出仅一个整数,输出最少需要操作的次数。如果答案不存原创 2017-09-20 13:48:46 · 441 阅读 · 0 评论 -
UVA227解题报告
因为网格中存在空格所以用gets录入,首先录入一行数据,如果第一个字符为'Z'则break退出循环其次是对指令的接受与处理,接受指令可以用getchar(),遇到换行符跳过。处理也很简单,在接受指令之前我们需要一个定位操作,找到空格所在的位置,然后根据指令确定要移动到的坐标,用swap函数交换数据,更新空格位置大体思路就这样,附上AC代码#include#include#inclu原创 2017-09-18 12:45:09 · 843 阅读 · 0 评论 -
南阳理工OJ73
比大小时间限制:3000 ms | 内存限制:65535 KB难度:2描述给你两个很大的数,你能不能判断出他们两个数的大小呢?比如123456789123456789要大于-123456输入每组测试数据占一行,输入两个不超过1000位的10进制整数a,b数据保证输入的a,b没有前缀的0。如果输入0 0表示输入结束。测试数据组数原创 2017-09-24 21:09:44 · 447 阅读 · 0 评论 -
Color the fence
Color the fence时间限制:1000 ms | 内存限制:65535 KB难度:2描述Tom has fallen in love with Mary. Now Tom wants to show his love and write a number on the fence opposite to Mary’s house. Tom thinks t原创 2017-09-22 21:55:27 · 498 阅读 · 0 评论 -
C - Shopping Street(AtCoder Beginner Contest 080)
题目链接 https://beta.atcoder.jp/contests/abc080/tasks/abc080_c解题方法 因为一共只有十个时期所以我们可以枚举所有的状态,又因为必须有1个时期开放,所以我们从1而不是0开始枚举AC代码#include#include#include #includeusing namespa原创 2017-12-03 22:29:40 · 523 阅读 · 0 评论 -
B - Palindrome-phobia(CODE FESTIVAL 2017 Final)
题目链接 https://cf17-final-open.contest.atcoder.jp/tasks/cf17_final_b解题思路 通过找规律发现出现的次数最多的字符与其他两个字符数量的差不能大于1AC代码#include#include#includeusing namespace std原创 2017-11-25 19:29:06 · 512 阅读 · 0 评论 -
2011 Asia - Dhaka Candles题解
题目来源:2011 Asia - Dhaka题目链接:UVALive - 5810 UVA12368分析:二进制枚举,难点在于check函数,由于所给的时间很短,所以我们必须现预处理一下当前所购买的蜡烛是否满足要求check函数是这样的,首先判断是否直接包含这个数字,如果不能则分成两个数的和,注意这两个数也同样不能共用一个数字,由于忘记了这里,我开始只写一个have函数进行判断,结果失...原创 2017-05-10 10:46:09 · 1390 阅读 · 0 评论 -
Wannafly挑战赛24A题
/**题目链接:https://www.nowcoder.com/acm/contest/186/A*分析:奇数x分为(1,x - 1)时为最优解,偶数等待合并*若奇数x == 1,忽略此数*a个奇数分解花费a次,b个偶数合并花费(b - 1)次*a个奇数分解后有a + b个偶数,b是原始的偶数个数*综上所述,总的可执行过程为a +(a + b - 1)= 2 * a + b - 1次...原创 2018-09-15 08:58:01 · 506 阅读 · 0 评论 -
hiho一下 第216周
分析这道题挺不错的,巧妙的运用到了优先队列、 首先,因为n个点事确定的,所以我们可以得到n - 1个区间;其次,因为还有k个点事不确定的,所以我们把这k个点依次插入到这n - 1个区间里,在这里我们可以自己定义一个结构体,里面有len和k两个属性,非别代表一个区间的长度和分成的段数,初始化每个区间只有1段;每一次我们从优先队列里取出len / k最大的区间,然后让k++,之后再把它push到...原创 2018-08-24 14:28:48 · 473 阅读 · 0 评论 -
uva417
挺有意思的一道题 迭代深搜 + 二分 实际上根据笔者测试,使用迭代深搜打表后直接用暴力枚举也可以通过,但如果测试用例T的范围开到1e5在极端情况下就会TLE,但是UVA的测试数据显然没有这样的,以为即便是暴力笔者也只跑了0ms 参考代码//迭代深搜 + 二分#include <cstdio>#include <iostream>#include <...原创 2018-08-06 14:30:57 · 297 阅读 · 0 评论 -
PAT1003 Emergency (25)
引论 本以为这是一道水题却因为考虑不周WA了半天,参考了博客https://blog.csdn.net/tiantangrenjian/article/details/19434417,感觉这题还是蛮不错的题目链接https://pintia.cn/problem-sets/994805342720868352/...原创 2018-07-30 20:33:46 · 471 阅读 · 0 评论 -
UVA818解题报告
/** UVA 818*理解了题意和水题差不多**条件:一些可能相同的无向边**要求:* 构建一个满足如下三个要求的图* 一、不能有环* 二、连成一条直线* 三、所有节点要连在一起**操作:我们仅可以选中一个节点来连接不同的线段* 每当我们选中一个节点时,该节点与其他节点的连接断开* 此时,节点可用于连接线段**解法:位运...原创 2018-07-08 21:27:07 · 930 阅读 · 0 评论 -
HDU - 3018解题报告
题意简述给出n个节点,m条边,问要想全部经过这m条边且每个边只经过一次至少需要多少条路径分析这个题实际上就是一笔画问题中的定理二:如果连通无向图 G 有 2k 个奇顶点,那么它可以用 k 笔画成,并且至少要用 k 笔画成 证明参见维基百科:zh.wikipedia.org/wiki/一笔画问题#一笔画定理 需要注意的是,在这个题中,他只关心能不能遍历这m条边而不关心全部遍历这N个...原创 2018-05-11 09:40:44 · 373 阅读 · 0 评论 -
牛客练习赛12 B迷宫解题报告
一切尽在代码中#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>using namespace std;const int maxn = 500 + 10;char maze[maxn][maxn];int vis[maxn][maxn][2];...原创 2018-02-14 17:28:50 · 419 阅读 · 0 评论 -
hdu1076
题目链接 An Easy Task解题思路 题目要求给出一个年份Y和一个整数N,输入从Y年起第N个闰年。 首先我们容易知道我们需要判断一个年份是否是闰年,我们可以把它封装成一个函数,这样可以方便我们下次调用,在这里我写了一个is_leap_year来完成这个工作 其次我们知道如果我们已经得到了第一个闰年,那原创 2018-01-07 20:11:46 · 769 阅读 · 0 评论 -
Leetcode 100. Same Tree
分析这道题算是一道关于树的简单题,我们需要判断给出的两棵树是否相等,分为三步,判断当前节点是否相等,判断左右子树是否相等。要特别注意一下为NULL的情况我的代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *ri原创 2018-01-01 21:17:27 · 313 阅读 · 0 评论 -
牛客练习赛8 D加边的无向图
题目链接https://www.nowcoder.com/acm/contest/39/D解题思路 利用并查集查找一共有几个独立的集合,最后需要的最少边为集合个数减一AC代码#include#includeusing namespace std;typedef long long LL;const int maxn = 100010;LL pa[ma原创 2017-12-15 21:11:09 · 371 阅读 · 0 评论 -
B - fLIP
题目链接:http://code-festival-2017-quala.contest.atcoder.jp/tasks/code_festival_2017_quala_b一个棋盘有N行,M列设点击i行,则黑色棋子个数为i * M设点击j行,则黑色棋子个数为j * N设点击i行j列,则由黑转白的棋子个数为2*i*j故当点击i行j列时,黑色棋子个数为i * M + j * N原创 2017-11-13 21:29:38 · 300 阅读 · 0 评论 -
UVA10562解题报告
https://github.com/DongChengrong/ACM-Program仔细观察他给出的树,我们可以发现这棵多叉树长得比较有特点。最上是树根,而每一个节点只要有孩子下面就会跟着一个字符‘|’,我们可以根据这个特点来判断一个节点是否有孩子。如果有我们就继续捕捉他的子节点。如何将他的子节点一网打尽呢?我们有注意到所有的子节点的上方都有字符'-',所以我们可以从这里做文章,先找到‘-’字符的最右边,在从这个位置依次往左寻找在'-'字符的下面是否有子节点原创 2017-08-14 17:27:05 · 386 阅读 · 0 评论 -
罗马数字转整形(LeetCode题目)
LeetCode第13题,给定一个罗马数字,将他转换为整形AC代码class Solution {public: int romanToInt(string s) { int result = 0,num = 0,pre = INT_MAX; for(int i = 0; i < s.size(); i++) {原创 2017-08-20 21:57:05 · 450 阅读 · 0 评论 -
小明的调查作业(南阳理工OJ48)
直接一个Set集合就可以搞定AC代码#include#includeusing namespace std;int main(){ int n,buf; set s; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&buf); s.insert(buf);原创 2017-07-28 17:32:08 · 579 阅读 · 0 评论 -
UVA1594解题报告
这么垃圾的代码竟然没有超时,我真不知道是该欢喜还是愁AC代码 Time 0.11s#include#includeusing namespace std;const int maxn=20;int num[maxn];int main(){ int T; scanf("%d",&T); while(T--) { int n;原创 2017-05-18 22:11:52 · 452 阅读 · 0 评论 -
UVA1592解题报告
这道题让我费了我好几天的时间,差不多打掉了我对算法的全部信心。不过,幸好,经过几天的努力我终于AC了这道题,解开了我的一个大心结。下面我将列出三份代码,其中后两份是WA代码用来给同样WA的同伴提供点思路,看看是否犯了同样的错误。首先给出的是AC代码,思路如下将题目抽象知,给出一个M行N列的数据库,要求给出是否存在两行有两列相同。由于字符串的操作过于繁琐容易超限,所以先进行编号。原创 2017-05-18 12:38:19 · 605 阅读 · 0 评论 -
UVA230解题报告
这个题耗了我六天时间,很打击我对算法的学习,不过,我终于解决了他。分析如下仔细观察我们可以发现后面的操作与输出都是围绕标题(title)展开的,作者(author)所起的作用不过是排序而已。我们还注意到一个有趣的地方,即书籍上架时实现排序在上架,那么我们完全可以认为如果能确定一本书的状态的话,我们直接从前往后扫过去就可以了。状态的确定难不难呢?我觉得不难,由题意知每本书有三种状态(已上架、借出原创 2017-05-29 06:45:22 · 844 阅读 · 0 评论 -
UVA10881解题报告
还是那句话,解题先看题。由题意知有一根长度为L的木棒,木棒上面有n只蚂蚁,每只蚂蚁或朝左或朝右且以每秒1cm的速度移动,吗,蚂蚁相撞后掉头,问T秒后每只蚂蚁的状态(按输入顺序输出)。由题解题,因为每个蚂蚁相遇后都会掉头所以我们首先发现他们的相对位置是固定的不变的,其次我们注意到两只蚂蚁相遇后再调头后的位置与蚂蚁直接穿过对方的位置相同,只是两种情况下相同位置下是不同蚂蚁。所以我们可以列出以下等式原创 2017-04-25 16:07:34 · 334 阅读 · 0 评论 -
poj1163解题报告
经典的动态规划,分析省略不懂的完全可以百度(数字三角形),仅给出AC代码Memory 260k time 32ms#include#include#includeusing namespace std;const int maxn=100+10;int dp[maxn][maxn],a[maxn][maxn];int main(){ int n; scanf(原创 2017-04-24 19:48:04 · 379 阅读 · 0 评论 -
poj3617解题报告
题意:输入一个整数n,后面跟着n行大写字母,现要求对这些字母进行排序,要求字典序最小,每80个字母一行且字母只能从两端任取一个。根据上面的信息我们不难想到若使字典序最小则只需从两端选取最小的字母即可。不过聪明的读者也一定注意到了,如果两个字母大小一样怎么办?没关系,我们继续往里找就可以了。如果左边的字母最先出现小的则选左边的,反之亦然。当所有字母一样大小也即对称时任选一个即可。如此写出使用原创 2017-04-23 18:37:16 · 423 阅读 · 0 评论 -
UVA232解题报告
水题留念Time 0.01s#include#includeusing namespace std;const int maxn=15;int row,col;char G[maxn][maxn];int vis[maxn][maxn];int print(int r,int c){ printf("%3d.",vis[r][c]); while(c<col原创 2017-05-23 18:01:15 · 580 阅读 · 0 评论 -
zoj3961解题报告
借今年浙江省赛的题练练手。首先,由题意知,A与B发信息,当A与B连续互相发信息m天时,好感度point+1.。输入有A向B发信息的天数与B向A发信息的起止天数,具体格式看题。原创 2017-04-23 13:49:37 · 531 阅读 · 0 评论 -
uva12100解题报告
水题留念一个队列模拟进出操作,一个优先队列保存优先级,模拟过程输出结果#include#include#include#includeusing namespace std;const int maxn=100+10;typedef pair P;struct cmp{ bool operator () (const P &p1,const P &p2)cons原创 2017-05-22 11:01:28 · 744 阅读 · 0 评论 -
poj1287解题报告
对于学过图和Prim算法的人来说,此题是一道不折不扣的水题,尤其是输入范围限定在了50之内,所以即便我用了O(n^3)的算法也只用了16MS就AC了。前期建图,我用的是邻接矩阵,当两个节点有多个路径时选择最小的录入。建完图后开始对图操作,使用的是Prim算法,其精髓是选取与集合A相接的最小边,其中集合A代表已选择节点。有疑问的可以百度Prim或参考算法导论的相关章节具体代码如下,Mem原创 2017-04-22 09:13:45 · 618 阅读 · 0 评论