摘要:
题意:告诉某一天,然后往前和后各推一定天数,输出计算之后的日期。解法:一天一天模拟,日期的在各个位的进制不尽相同。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int month[13] = {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};bool leap(int y) { return (y%4==0 && y%100!= 阅读全文
摘要:
题意:有N头牛,这些牛都拥有一个属性x表示其在坐标轴上的坐标。现在给定ML组约束条件表示A、B两头牛坐标之差不能够超过C;MD组约束条件表示A、B两头牛坐标之差不能小于C,现在问1和N号牛之间最长的距离为多大,如果存在则输出最大长度,如果任意输出-2,如果已知条件存在矛盾输出-1。解法:根据已知条件建立约束系统,问题在于形容两个点之间的距离看似是一种双向边的关系,但是如果一旦建立双向的负边那么就会发生错判了,这显然是错误的,因此我们只能够建立单向的边。为每一个点都选择一个参考点,我选择N号点作为参考点,那么每个点的相对距离就变成了与N号点的距离之差,所有边就都成为了从编号小的点指向编号大的点, 阅读全文
摘要:
题意:已知A0 = 0 , A1 = 1 , An = 3 * An - 1 + An - 2 (n >= 2). 求 AAAAN Mod (1e9 + 7) (也就是A[A[A[A[N]]]])。解法:标程竟然使用set+pair来寻找循环节,并且第一次循环节长达222222224,不知道内存要吃掉多少。由于是一个嵌套的定义,因此要找出每一层的循环节,最终推出最内层的循环节为240,次之为183120,再之222222224,最后就是1e9+7了。通过矩阵快速幂求解第x项还是飞快的,注意当某一层为0时最后的结果就为0了。代码如下:#include <cstdlib>#inc 阅读全文
摘要:
题意:给定N个任务,每个任务有一个完成时间。这些任务之间有完成的四种先后顺序,假设这种二元关系建立在x,y之间: SAS:x至少在y开始时开始 SAF:x至少在y完成时开始 FAS:x至少在y开始时完成 FAF:x至少在y完成时完成 现在问这些任务在最短时间内都被完成的任务安排如何?输出每个任务开始的时刻,如果不能的话输出impossible。解法:根据开始时间建图,之后再虚拟出一个任务0,这个任务必须在每个任务完成后完成,因此在0到每个任务之间添加一条边,最后计算出所有节点中到0点最迟的开始的任务,设该任务0点开始,并让每个任务的开始时间都加上这个时间差。代码如下:#in... 阅读全文
摘要:
题意:问最少多少个过同一点的平面能够将空间分成N份。解法:这题的基本思路肯定是求出x个平面最多能够划分出多少个子空间,然后二分枚举出答案。小涛神说了一种非常神的方法来解这一题,那就是得到三组最简单的解,假设最后的通项公式是一个最高次为1次的表达式,那么采用待定系数法用两组数据得到表达式然后使用第三组检验前两组得出的解。如果不相符的话那么再推出一个解,假设通项公式最高次为2次解方程...最后就能够得到这题的通项公式:f(x) = x*x - x + 2。 当然,我是想使用递推公式来解决这一问题,由于三个平面最多将空间分成8份,而在增加一个平面的话,由于所有平面都要过一个点,那么三个平面就已经确. 阅读全文
摘要:
题意:求出两点的距离。解法:由于有一种情况相加将超出long long的最大表示范围,由于计算机将减法都视作是加法,因此溢出之后的值如果使用无符号格式控制符来输出的话,结果是对的。代码如下:#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <algorithm>using namespace std;int main() { int T; scanf("%d", &T); while (T--) 阅读全文
摘要:
题意:下图给定边长L和旋转角度a,求重叠之后的面积。解法:由于紫色的角已知是45度,加上a已知,可以推出phi等于a,设红色边长度为x,有x+x*cos(a)+x*sin(a) = L,根据公式得到x = L / (1+cos(a)+cos(a)),由于四个多出来三角形面积和形状都相同,因此重合的面积为L*L - 1/2 * x*cos(a) * x*sin(a) * 4 = L*L - x*x*sin(2*a)。代码如下:#include <iostream>#include <cstring>#include <cstdlib>#include < 阅读全文
摘要:
题意:有这样的一个需求,一个程序能够动态的插入数字,并且能够以很快的速度给出一个数字在已有的数字集合中异或之后值的最大或者是最小值。解法:将插入的数构成一棵字典树,然后将每一个数字以贪心的思想去匹配,如果一个数字为1010,要求与它异或之后值的最小值,只需要在为1的地方优先匹配1,为0的地方优先匹配0;如果是求最大值就把这个数字进行取反操作,然后找出一个数与取反之后的数异或值最小即可。代码如下:#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#incl 阅读全文
摘要:
题意:询问一个区间内要么只包含3,要么只包含8的数有多少个?解法:数位DP,可惜比赛的时候忘了怎么写了,随便写了个DP没有过,后来才调过了。正确解法是开设一个状态: f[i][0]表示剩下i+1位数中且暂时不含有3,8的满足要求的数的个数(i位数字可从全0取到全9,后同) f[i][1]表示剩下i+1位数中且暂时只含有3的满足要求的数的个数 f[i][2]表示剩下i+1位数中且暂时只含有8的满足要求的数的个数 f[i][3]表示剩下i+1位数中且已经含有3和8的满足要求的数的个数,该结果恒为零 标程的解法使用了位运算来计算状态,非常清爽。代码如下:#include <cst... 阅读全文
摘要:
A:Non-negative Partial Sums题意:给定一个序列,我们能够给这个序列做一个循环移位的操作,即把第一个数字放到整个序列的最后一位。问存在多少种移动后的状态满足对于所有的前缀和都大于等于0。解法:对于一个长度为N的序列,设从1-i的前缀和为sum[i],假设已经有K个数字从前面移动到序列的后面,那么对于当前序列的前N-K个元素减少的值为移动到后面的K个数字的和,增加为0,因此从sum[K+1...N]从选择一个最小的减去sum[i]查看是否大于等于0即可。对于后面K个元素,增加的值为sum[N]-sum[i],减少的值为0,因此从sum[1...K]中选择一个最小的加上su 阅读全文