[链接]h在这里写链接 [题意] 让你在n个点组成的集合里面选取不为空的集合s. 使得这里面的点没有出现某个点a和b,ax>=bx且ay>=by; 问你s的个数. [题解] 我们把这些点按照(x,y)升序排(x优先,y次之). 然后按顺序处理这些点. 会发现. 我们在处理(x,y)点的时候. 只有它的左上方那些点是可以和他在一起的. (也即xi<x 且 yi > y) 随便取左上方的矩形区域里面的一个点.都能组成一个集合. 但是随便取的那个点,可能也可以和它的左上方的更小的矩形区域…
[链接]h在这里写链接 [题意] 给你一个长度为n的数字(n<=1000) 然后让你任意组合这个数字. 使得这个数字能被8整除. (不能出现前导0) [题解] 只要后三位能被8整除就可以了. 则枚举最后3位是什么. 从000-999->只枚举8的倍数就可以了. 小于等于3位的情况,特殊判断一下就好. 然后剩下的数字,先放一个最小的非0数字在开头. 剩下的从小到大安排就可以了. (可以把它放在字符串vector里面.最后排下序输出最小的就好了) [错的次数] 0 [反思] 在这了写反思 [代码]…
[链接]h在这里写链接 [题意] 在这里写题意 [题解] 枚举0在哪个位置就好. [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/stdc++.h> using namespace std; const int N = 1e3; int t[N + 10], a[N + 10], n; int f(int pos) { int ma = 0; int x = 0; for (int i = pos; i >= 1; i--) { if (t[i] ==…
[链接]h在这里写链接 [题意] 在这里写题意 [题解] 在这里写题解 [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/stdc++.h> using namespace std; int n, a, b; int main() { ios::sync_with_stdio(0), cin.tie(0); cin >> n >> a >> b; for (int i = 1, x; i <= n; i++) cin &…
[链接]h在这里写链接 [题意] 定义bad list是一个非空的.最大公约数为1的序列.给定一个序列,有两种操作:花费x将一个元素删除.花费y将一个元素加1,问你将这个序列变为good list所需要的最小花费是多少. [题解] 枚举gcd为i. 这里的枚举,并不是说确切这些数字的gcd就是i; 而是枚举这些数的gcd是i的倍数. 这样的话,每个数字都必须是i的倍数. (然后,我们只要贪心地让每个数都变成i的倍数就好了,最近的i的倍数,这样肯定是最优的) (最后gcd到底是多少,并不重要,只要…
[题目链接]:https://csacademy.com/contest/round-36/task/bicycle-rental/ [题意] 让你从n辆车中选一辆车; 每一辆车有3个属性 1.到达车的身边的时刻 2.车什么时候开始能够被使用 3.车到达它家所需时间; 问你到家的最早时刻. [题解] 车如果晚于可用时间,a+c 否则b+c 取最小值就好 [Number Of WA] 0 [反思] 手速题 [完整代码] #include <bits/stdc++.h> using namespa…
[Link]:https://csacademy.com/contest/round-37/task/reconstruct-graph/statement/ [Description] 给你一张图; 包含n个点;m条边; 你可以在这张图的基础上添加边(不能有重边和自环); 使得节点1到节点i的最短距离为d[i] 问你可能的图的个数; [Solution] 对于某一个节点x; 它只能和d的值为d[x]-1或者d[x]的节点直接相连 因为,d的值相同的x和y,如果它们俩之间连一条边的话,它们到节点…
[Link]:https://csacademy.com/contest/round-37/task/group-split/ [Description] 让你把一个数分成两个数a.b的和; (a,b>0) 使得b是a的倍数 问分法个数 [Solution] 设b=x∗a; 则 a+x∗a=n a∗(x+1)=n 这里可以看出来,a必须是n的因子; 再把x分离出来 x=na−1 而x>=1 则 a<=n2 这里n/2实际上就是第二大的因子 所以,这里等价于a< n 于是乎,问题转化…
[Link]:https://csacademy.com/contest/round-37/task/boring-number/ [Description] 让你找离平均数最近的一个数的下标; [Solution] 判断的时候,平均数和枚举的数都乘上n; 这样精度比较高;避免小数比较; [NumberOf WA] 0 [Reviw] empty [Code] #include <bits/stdc++.h> using namespace std; #define lson l,m,rt&l…
[Link]:https://csacademy.com/contest/round-39/task/seven-segment-display/ [Description] 0..9各自有一个数字,代表组成它需要几根棍子; 给你k根棍子,然后问你这k根棍子能够组成的最小数字是多少; [Solution] 数位DP; 设b[0..9]表示对应下标的数码要多少根棍子组成; 设f[i]表示i根棍子能否组成一个数字,如果能的话,组成的数字最小是由几个数码组成的; (为INF表示不能组成); f[0]…
[Link]:https://csacademy.com/contest/round-39/task/reconstruct-sum/ [Description] 给你一个数字S; 让你找有多少对A,B 满足A+B=S 然后再给你一个01串,表示某一位在算加法的时候有没有进位; 在上面的A,B中筛选出符合这个01串的A,B; 输出对数. [Solution] 对S的每一位考虑; 从后往前 如果该位x的后一位进了一位到这一位; 则两个加数在这一位上的需要的数字为x=x-1,否则仍为x 然后看看这一…
[Link]:https://csacademy.com/contest/round-39/task/circle-elimination/ [Description] [Solution] 把n个点依次标为1..n; 然后按照数字大小给每个人排序(记录它原来的位置); 走到第一个人,然后依次走到下一个人即可; 每次枚举往左走还是往右走即可; [NumberOf WA] 0 [Reviw] [Code] /* */ #include <bits/stdc++.h> #define int lo…
[Link]: [Description] [Solution] 每读入一个x; 把a[(x-1)/2]置为1即可; 统计1的个数 [NumberOf WA] [Reviw] [Code] /* */ #include <bits/stdc++.h> #define int long long using namespace std; int n; int a[100000+100]; main(){ scanf("%lld",&n); for (int i = 1…
[链接]链接 [题意] n个人从左到右站在一条直线上.每个人都有一个能力值g[i],然后每个人可以将相邻的一个人打败. 然后它的能力值能够增加相应的能力值(就是打败了的那个人的能力值). A能够打败B的条件是g[A]+D>=g[B]. n-1次后,只会剩下一个人了. 问你最后的那一个人可能是谁. 输出所有可能的人的编号. [题解] 设dfs(i),表示要找第i个人能不能成为最后的winner. 暴力做的话,肯定会超时的. ->O(N^2)的算法了. 于是我们寻求更快的方法. 我们维护以下两个东…
[链接]h在这里写链接 [题意] 一开始有n个数字,然后有一个数字X,把每个数字都减去X,又生成N个新的数字. 然后把这2*N个数字混在一起. 告诉你这2*N个数字是什么.让你复原出原来的N个数字,以及数字X. 或告知不可能. [题解] 考虑一开始的n个数字a[1],a[2]...a[n]; 假设a[1] <= a[2] <= ... <= a[n]; 然后混起来的2*N个数字. 最小的肯定是a[1]-X. 则,我们枚举a[1]为2..n中的某个数字. 则我们可以暂时算出来X的值. 然后…
[链接]h在这里写链接 [题意] 让你把一个正方形A竖直或水平翻转. 问你翻转一次能不能把A翻转成B [题解] 有说一定要恰好为1次. 并不是说A和B相同就一定不行. [错的次数] 2 [反思] 自己强行理解错题意 [代码] /* */ #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <vector> #include &…
[链接]h在这里写链接 [题意] 在这里写题意 [题解] string类模拟 [错的次数] 0 [反思] 在这了写反思 [代码] /* */ #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <vector> #include <map> #include <queue> #include <i…
[链接]点击打开链接 [题意] 给你一个0..n和0..m的区域. 你可以选定其中的4个点,然后组成一个正方形. 问你可以圈出多少个正方形. (正方形的边不一定和坐标轴平行) [题解] 首先,考虑只和坐标轴平行的情况. 则长度为L的正方形有(N-L+1)*(M-L+1)个. 然后引入一个bounding box的概念. 一个正方形的bounding box,指的是一个最小的包括了正方形的4个点的一个矩形. 且矩形的边都是和坐标轴平行的. 正方形的bounding box都是正方形! 这样,我们刚…
[链接]h在这里写链接 [题意] 在这里写题意 [题解] 大水题 [错的次数] 0 [反思] 在这了写反思 [代码] /* */ #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <vector> #include <map> #include <queue> #include <iomanip…
[链接]点击打开链接 [题意] 给你一个n*m的矩形,让你在其中圈出若干个子正方形,使得这些子正方形里面的所有数字都是一样的. 且一样的数字,都是在同一个正方形里面.问你有没有方案. [题解] 相同的必须在同一个子正方形里面.且正方形里面的数字都得是一样的. 那么只要每次找一个相同数字的连通块,然后看看这个连通块是不是一个正方形即可. 然后如果某个连通块出现了2次以上直接输出无解.(这两个数字不是连在一起的.中间肯定有其他数字) 如果某个连通块不是正方形,也直接输出无解. (表示肯定会覆盖到其他…
[链接]点击打开链接 [题意] 给你一个n节点,m条边的无向联通图. 给你一个节点访问的顺序.(1..n的排列) 你可以改变每个点优先访问的出度.(但必须按照dfs的规则); 问你能不能按照所给的访问顺序访问所有的点. [题解] 模拟题. 按照要求,看看当前到达的点的出度里面有没有下一个点. 没有的话,看看这个点是不是没有其他可以到达的点了.(访问过的点就不能再访问了) 如果是这样的话,就返回上一层的点继续搜,否则的话直接输出无解. (因为如果有其他的点可以到达的话,显然必须得先走那些点,这样就…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然只有在前i个位置奇数偶数出现次数都相同的地方才能切. (且不管前面怎么切,这里都能切的. 那么就相当于有n个物品,每个物品的代价是|a[i]-a[i-1]|,然后价值是1. 因为价值是一样的..所以肯定优先选价值最小的几个... 直接sort就可以了.. [代码] #include <bits/stdc++.h> using namespace std; const int N = 100; const int INF =…
[链接] 我是链接,点我呀:) [题意] 让你猜到火星的距离x是多少. 已知1<=x<=m 然后你可以问系统最多60个问题 问题的形式以一个整数y表示 然后系统会回答你3种结果 -1 x<y 0 x=y 1 x>y 但是系统有时候会撒谎 这个撒谎的过程由一个长度为n的序列决定 n<=30 如果p[i]=1表示它对接下来的询问不会撒谎 p[i]=0表示它对接下来的询问会撒谎 撒谎之后系统会输出-ans 如果问的个数>=n了那么重新从1开始 p数组未知 但是长度n告诉你了…
[链接] 我是链接,点我呀:) [题意] 给你n个数字,每个数字可以无限用,每种方案可以组成一个和,问你%k的结果有多少种不同的结果. [题解] 相当于给你一个方程 \(x_1*a_1+x_2*a_2+...+x_n*a_n=c\) 然后根据裴蜀定理 设a1,a2,a3......an为n个整数,d是它们的最大公约数,那么存在整数x1......xn使得x1a1+x2a2+...xnan=d c只能为d的倍数. 因为把那个式子两边同乘上倍数就能构造出id了 可能会有些xi<0 但如果数字足够大的…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 有个性质. 如果p/q是分数的最简形式. 那么p/q能化成有限小数. 当且仅当q的质因数分解形式中只有质因子2和5 (且不能出现其他质因子) (也就是说q的质因子只能出现10的质因子里面出现过的 因为只有这样分母才能化成10^n的形式. 才能化成小数. 因此.对于在b进制下的小数p/q 只要看看q的质因子是不是都是b的质因子就可以了. 显然可以用gcd来搞. 每次都用q去除gcd(q,b) 这样.如果最后q能够变成1.那就说明q…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把x..y这条路径上的点标记一下. 然后从x开始dfs,要求不能走到那些标记过的点上.记录节点个数为cnt1(包括x) 然后从y开始dfs,也要求不能走到那些标记过的点上.记录节点个数为cnt2(包括y) 答案就为n(n-1)-cnt1cnt2; (即所有的点对减去这些不符合要求的点对 [代码] #include <bits/stdc++.h> #define ll long long #define pb push_back…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 我们考虑每个字符串中出现最多的字母出现的次数cnt[3] 对于这3个cnt的值. 如果cnt+n<=s[i].size 那么显然最多能出现cnt+n次这个字母 但是如果cnt+n>s[i].size() 那就有问题了. 因为每次变换的字母不能和原来的一样. 因此全都变成某个字母之后.接下来肯定会破坏这个全都一样的性质. 所以我们可以这样. 贪心地全都变成这个出现次数最多的字母. 直到只剩下一个字母不为这个字母,也即"…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 这个x2,y2和圆心(x1,y1)相连.形成的直线和圆交于点(x3,y3) 则(x2,y2)和(x3,y3)的中点就是所求圆的圆心. 半径就是x2,y2到x3,y3的距离的一半. 写个向量的方法,求出x3,y3的坐标就好了. [代码] #include <bits/stdc++.h> #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 设\(设f(x)=a_d*x^{d}+a_{d-1}*x^{d-1}+...+a_1*x+a_0\) 用它去除x+k 用多项式除法除一下就好. 会发现余数等于 \(∑_0^{d}(-k)^{i}*a_i\) 这是一个十进制数转成负k进制数的和的形式. 而p已知. 问题就转化为把十进制数p转成-k进制数的问题了. [代码] #include <bits/stdc++.h> #define ll long long using n…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] ans初值值为a[1..n]中1的个数. 接下来考虑以2为结尾的最长上升子序列的个数. 枚举中间点i. 计算1..i-1中1的个数cnt1. 计算i..n中2的个数cnt2. ans = max(ans,cnt1+cnt2) 写个前缀和 翻转. 断点在l..r中 f[l][r]表示l..r翻转后以2结尾的最长上升子序列 简单DP ans = max(ans,cnt[l-1][1]+f[l][r]+cnt[n][2]-cnt[r]…