
Tyvj/Vijos
Coco_T_
东南大学本科毕业生,浙江大学在读研究生
展开
-
Tyvj1057
题目链接分析: 背包,写的时候记住不要手残这里写代码片#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int N=100005;int f[32005];int w[N],v[N],tot=0;int fj[N][2];bool p[N];int n,m;int main()原创 2017-09-05 14:08:31 · 247 阅读 · 0 评论 -
Tyvj1032
题目链接分析: 显然,比c面值大的钱,我们直接给就好了 那么问题就变成了,有一堆比c面值小的硬币, 让我们凑出尽量多的c正当我苦于c的范围无法承受01背包时 我又看了一遍题面,发现了这句话: 每一个面额都能整除所有比它大的面额这句话好像非常的关键 也就是说,大面值的钱能做到的事,比ta小的硬币都能做到显然我们要是能凑出c的钱数 就不要给奶牛贝西大于c的钱优先选用面值大的钱(直觉告诉我)原创 2017-09-01 17:27:31 · 314 阅读 · 0 评论 -
Tyvj1147
题目链接分析: 数的范围挺小, 所以直接开一个数组, len(x)=len(x-k)+1tip可能有负数,所以所有数都要加上100000 数组大小要开到100000*3 因为k有可能是负的这里写代码片#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int N=100001;in原创 2017-09-11 08:27:50 · 325 阅读 · 0 评论 -
Tyvj1037
题目链接分析: 这道题还是挺好的 分da析biao发现 每五个一组,每组的末尾0的个数相同 分别是0,1,2,3… 后面的0都是不用进行计算的 一眼高精—->只过了3个点注意到了k<=10 看来不用高精也行,只需要在保证答案没有0的情况下每次%10^k即可 但是我们怎么去除0的存在呢显然*10就会让答案多出一个0 而10=2*5,也就是说乘的数中,如果有2*5(10),也会产生一个原创 2017-09-01 21:36:21 · 209 阅读 · 0 评论 -
Tyvj1043
题目链接分析: 这题堪比立方图 实在是需要耐心和细心 我觉得noip之前做一些这样的题可以提高自己的稳定程度首先要在整个式子外加一个() 数字好处理,直接塞到一个数字 当遇到符号的时候,先判断一下ta与符号栈栈顶元素的优先级关系 如果栈顶是 ( ,就直接入栈 如果出现优先级不增的情况就要计算 如果当前是 ) ,就匹配括号tip有可能式子中会出现负数 计算中就当-操作处理 要是最后原创 2017-09-02 08:07:33 · 302 阅读 · 0 评论 -
Tyvj1053
题目链接分析: 这道题我觉得比表达式求值还难受直接模拟 在碰到当前位置的下一个位置是‘-’时 就要考虑展开了不必展开的所有情况:1.a-a —-> a-a -号两边的符号相同 2.a-b,1-2 -号两边的符号紧邻 —-> ab —-> 12 3.a-4,3-b 两边的符号不同类 —-> a-4 —-> 3-b 4.-号前后也是- –9 —-> –9展原创 2017-09-03 07:43:49 · 311 阅读 · 0 评论 -
Tyvj1054
题目链接分析: 又是一个区间dp实际上每一行都是独立的 我设计的状态是这样的 f[i][j][k]表示第i行,前面用到了j(j已用),后面用到了k(k已用) f[i][j][k]=max{f[i][j][k+1]+k*(1<<(j+m-k+1)),f[i][j-1][k]+j*(1<<(j+m-k+1))} 一开始的初始化有点难受 开了ll之后 有两个点WA了void doit(){原创 2017-09-03 09:13:49 · 242 阅读 · 0 评论 -
Tyvj1098
题目链接分析: Tyvj上的题,描述都很清奇, 就像这道题,我怎么都觉得样例不对。。。这道题有一个限制:顺序不得改变 很显然这是一道区间dp 区间(i,j)的费用是:(T[j]+S)*(F[j]-F[i-1]) 这个S很不好搞啊,我们不知道之前我们分了多少组T[i]表示1~i的时间和 F[i]表示i~n的费用和 在这里我们实际上用的是倒推: f[i]表示对于从i到n的任务安排的最优解原创 2017-09-12 17:32:57 · 322 阅读 · 0 评论 -
Tyvj(无向图的桥)
题目链接分析: 无向图的桥tip这么裸的题我为什么没有一A呢 因为我又把n和m搞混啦!!!这里写代码片#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N=210;int n,m;struct node{ int x,y,nxt原创 2017-09-29 21:49:26 · 691 阅读 · 0 评论 -
Tyvj1293(新姿势:次短路)
题目链接分析: 我一开始想了一个自己都可以hack掉的算法: 先来一个朴素spfa 之后循环与终点相连的所有边, 到达终点的距离就是dis[way[i].y]+way[i].v 统计最小的路径和次小的路径,输出答案 竟然过掉了6个点然后我就暴力搜索,T了7个点,STO好,我们来正经的 于是我又想了一个做法,每个点都统计一下到达该点的最小距离和次小距离 但这好像不大现实后来我才发现,只原创 2017-09-14 19:17:06 · 233 阅读 · 0 评论 -
Tyvj1034
题目链接分析: 这道题很久以前(一年前???) 就做过了,但是直到现在我也并不觉得简单如果我们选择完成一项工作 那么最长休息时间就要看完成之后的状态f[i]=f[i+job[j].t]dp的原则是当前状态一定要由稳定状态转移来 那么明显要从后向前循环那如果当前没有任务怎么办呢f[i]=f[i+1]+1;状态分析完毕~这里写代码片#include<cstdio>#include<iostr原创 2017-09-01 11:36:25 · 219 阅读 · 0 评论 -
Tyvj1091
题目链接分析: 最近做的区间dp挺多 最简单的:n^3枚举,显然TLE 其实有一个很显然的dp状态: f[i][j]表示结尾是i,j的等差数列的数量: f[i][j]=Σ(f[k][j]+1) (a[i]-a[j]=a[j]-a[k]) 但是这样的复杂度也是n^3这是我们要注意到题目中a[i]的范围只有+-500 那我们就可以设计状态: f[i][j]表示结尾是i,公差是j的等差数列原创 2017-09-10 16:40:44 · 260 阅读 · 0 评论 -
Tyvj1079
题目链接分析: 我仔细看了一下 要想要通过(n/2,n/2), 那么在行数<=n/2的地方,我们就只能靠着最右边走 在编号>n/2的行中,就相当于一个数字三角形 因为我们只能向正下和向左下走, 所以列数 < n/2的数字就没什么用了 这里写代码片#include<cstdio>#include<cstring>#include<iostream>using namespace s原创 2017-09-07 19:36:33 · 265 阅读 · 0 评论 -
Tyvj1075
题目链接分析: 这道题真的是十分刁钻 一眼博弈,然并卵实际上我们这道题是从结束状态向初始状态转移的 首先明确状态的设定 用f[i][j]表示当前剩下i枚硬币, 上一轮对方取走j枚,面对此局面的人所能达到的最大价值先考虑边界条件: f[0][k]=0(1<=k<=n) 意思是最后我面对无子可取的情况, 对方上一轮取走k枚硬币,此时我能达到的最大值当然是0啦目标: f[n][1] 因原创 2017-09-05 21:51:24 · 292 阅读 · 0 评论 -
Tyvj1078
题目链接分析: 这个题有点像矩阵取数 实际上每次取数的时候,取的区间的答案是不随时间的变化而变化的 也就是说,每一部分的答案都是固定的, 我们可以只看区间(i,j)内的最优答案 反映到实际方案上,我们只要调整一下取数的顺序 按照从两边到中间的区间顺序取数就可以满足题意了说到底,题目限制只能从两边取的限制是迷惑选手的那么状态就很简单了 设状态: f[i][j]表示删掉i到j的所有数能到原创 2017-09-07 19:03:52 · 261 阅读 · 0 评论 -
Vijos1055(极大子矩阵)
题目链接分析: 浅谈用极大化思想解决最大子矩阵问题 算法二的复杂度是n*m,显然这道题是不能承受的 那么我们只能看一下算法一了:算法一的代码量明显多于算法二 主要分成两大部分:一.x轴上首先按照x坐标排序 第一面扫描我们从左到右, miny表示最大向下扩展到的下边界,maxy表示最大向上扩展到的上边界, dx表示矩阵的长,dy表示矩阵的宽,s表示矩阵的面积 针对每一个点,我们先向右扩原创 2017-09-24 07:56:35 · 368 阅读 · 0 评论 -
Tyvj1009
题目链接分析: 这道题是一道很好的 耐心型的模拟题 我在代码中找到的是每一个小方块的最左下角, 坐标的计算要稍微注意一下add(2*(n-i)+1+3*(k-1),4*(j-1)+1+2*(n-i));这里写代码片#include<cstdio>#include<iostream>#include<cstring>using namespace std;int n,m;int mp原创 2017-08-30 17:23:58 · 299 阅读 · 0 评论 -
Tyvj1013
题目链接分析: 一眼dp 如果没有要求时间最短那么一个二维背包就可以解决了 但是有了时间的限制,这就相当于在保存最大解的时候 记录一下花费,如果有不同状态可以转移到最大解 我们就保留一个最优解这就是一个比较特殊的dp了 需要两个限制都达到最优 一般情况下都是把一个限制加入dp的维度中 直接进行dp 但是这样的复杂度是O(n^4)的,显然不行 那我们就需要把原先的一个f(状态转移方原创 2017-08-30 19:19:35 · 272 阅读 · 0 评论 -
Vijos1164(CRT)
题目链接分析: CRTtip开ll,随时%这里写代码片#include<cstdio>#include<cstring>#include<iostream>#define ll long longusing namespace std;int n;ll a[20],b[20],x,y;ll M=1;void exgcd(ll a,ll b){ if (b==0) {原创 2017-09-17 16:02:01 · 216 阅读 · 0 评论 -
Tyvj1022
题目链接分析: 这道题要求我们把十进制数转化成负二进制 如果是二进制,那非常的简单(logn) 负二进制能不能以此类推呢我们先看几个例子吧 -2 |-13 1 -2 | 7 1 -2 |-3 1 -2 | 2 0 -2 |-1 1 -2 | 1 1 0-2 |10 0 -2 |-5原创 2017-08-31 21:35:38 · 244 阅读 · 0 评论 -
Vijos 1901 学姐的钱包(线段树优化dp)
题目链接分析: 学长讲的线段树例题我们可以将钱数看做是一个数轴 将一次交换看成数轴上的一个线段:(R[i]−V[i])" role="presentation" style="position: relative;">(R[i]−V[i])(R[i]−V[i])(R[i]-V[i]) 那么题目就可以视为带权值的线段覆盖问题如果不带权值,就是贪心的经典问题 而此问题原创 2018-02-06 16:57:30 · 314 阅读 · 0 评论