T0
T1
题目传送门(洛谷P4328)
题目描述:给你一个R×C的格子,由’*’(洪水),’.’(草地),’X'(石头),’S’(画家出发点),’D’(房子)构成,有以下几点需要说明:1,每一分钟画家能向四个方向移动一格(上、下、左、右);2,每一分钟洪水能蔓延到四个方向的相邻格子(空白区域);3,洪水和画家都不能通过岩石区域;4,画家不能通过洪水区域(同时也不行,即画家不能移到某个格子,该格子在画家达到的同时被洪水蔓延到了,这也是不允许的);5,洪水蔓不到画家的住所。(100%的数据:R,C<=50,地图保证只有一个’D’和一个’S’)
赛时我“洪水”是用bfs遍历,但不知道为什么我“画家”后来用dfs遍历,直接TLE了,正解是打两个bfs分别遍历“洪水”和“画家”
T2
题目描述:给定一个公路长度为L,路上原有N个路标即递增排列的N个整数,分别表示原有的N个路标的位置。路标的位置用距起点的距离表示,且一定位于区间[0,L]内,要新设K个新路标,使公路上相邻路标的最大距离最小,请注意,公路的起点和终点保证已设有路标,公路的长度为整数,并且原有路标和新设路标都必须距起点整数个单位距离。( 50%的数据中,2 ≤ N ≤100,0 ≤K ≤100;100%的数据中,2 ≤N ≤100000, 0 ≤K ≤100000;100%的数据中,0 < L ≤10000000)
最大值最小,明显二分,但赛时没打出来
T3
题目传送门(洛谷P4392)
题目描述:给出一个序列的长度n,其中有n个整数,要求找出这样的序列:序列长度为m,且序列内最大值和最小值的差不大于c。最后输出每个这样的序列的起始位置,若没有则输出"NONE"( 1<= n<=1000000,1<=m<=10000, 0<=c<=10000,0 <= ai <= 1000000)
从前往后遍历,用priority_queue(优先队列)或set或单调队列来维护序列中的最大值和最小值,赛时打了两个优先队列处理的时候TLE了(傻掉了)
T4
题目描述:给定n个数,首先要从左边的第一个数开始向右按动,中间可以跳过某些数,按动到最右边的数后,反向向左按动。最终,每个数都要按且仅按一次,每两个相邻数字之差的总和的最小值(2 <= n <= 1000,数字值均不超过2000)
分成两个序列进行dp,但是不会
T5
题目传送门(洛谷P1877)
题目描述:给定一个n表示歌曲数,一个beginLevel表示歌曲刚开始的音量,一个maxLevel表示最大限制音量,再给定n-1个数表示第i首曲与第i+1首曲之间的变化量,每首曲开始,你可以对音量选择增加或减少一个指定的变化值。当然音量不可能为负数,也不能太高,因此必需保证每首曲音量在0和maxLevel之间(包含),根据已有的开始音量beginLevel 和每首曲之间的变化量,求出最后一首曲的最大可能音量。如果没有方案,输出 -1(100%的数据:1<=n<=60;1<= maxLevel <=10000<= beginLevel <= maxLevel)
明显dp,但赛时没想到转移式
洛谷题解:典型的01背包问题,f[i][j]:前i首歌曲能否达到音量j,f[i][j]=0不能达到,f[i][j]=1表示可以达到,音量调高表示取第i件物品,音量调低表示不取第i件物品,音量为背包容量,01背包模板题(调高调低带约束),初始条件:f[0][beginlevel]=1,没演奏前可以到达beginlevel
//dp主体
f[0][beginlevel] = 1;
for(int i=1;i<=n;i++){
for(int j=maxlevel;j>=0;j--){
if(j-a[i]>=0) f[i][j]=f[i][j]||f[i-1][j-a[i]];
if(j+a[i]<=maxlevel) f[i][j]=f[i][j]||f[i-1][j+a[i]];
}
}
for(int i=maxlevel;i>=1;i--){
if(f[n][i]==1){
printf("%d",i);
return 0;
}
}
printf("-1");
return 0;
我承认是我傻了
T6
题目大意:给定一个数N,和一个数K,要求求出含有第K项的最长上升子序列的长度( 对于60%的数据,N<=10000; 对于100%的数据,1<=n<=300000 ,1<=k<=n,序列的每一个数为小于 的非负整数)
又是一题dp,赛时我直接打了个LIS模板,不管K,得了70分,数据真的水
T?
今天讲了图的最短路算法,这是本人听的第四遍了(去年寒假+去年聚龙+去年常州+今天),没什么好说的了
总结
恭喜你被我恭喜到了