CSP-S T1~T3 题解

· · 个人记录

CSP-S T1~T3 题解

T1

“他配得上自己的评级”

一道不太难想的

排序题?

思路:

我们先要考虑要减少数目要让每一只怪都攻击哪一只怪。由题易推得,我们只有每次攻击数值比当前的这只小的才最优。所以每次让每只怪攻击当前还存活的最小数值的怪一定是最优的。

实现:

sort排序后每次攻击队首(最小)的怪。

TIPS:

千万不要写72行得40分。

T2

文化课还是很重要的!!!

思路:

现在再看这题跟纯的中等大小模拟也没啥大区别了。

二分+贪心=黄+黄=绿

但由于这个题太难调了所以建议升蓝

我们先看看问题是啥:

1:当所有测速仪开启时,将会有多少辆车被判为超速?

2:关闭尽可能多的测速仪,使得原本被判为超速的车仍然被判为超速。所以关多少个?

我们可以分一下几个点理顺一下思路:

1:由于是匀加速直线运动,所以超速的区间一定是连续的,而且是可以被计算出来的。(但是要注意开闭!

2:第一问计算每辆车的超速区间并转换成测速仪的分布区间

3:第二问:一个比较经典的贪心(不大板子的板子,P1520),给定 n 个区间,m 个给定的点,求使用最少点使得所有区间中都包含点。这是一类经典的序列上贪心问题。首先把区间右端点排序,然后对每个区间讨论:如果已经包含之前选过的点(直接用上一个选的点判断)就跳过否则选一个最靠近右端点的点

实现:

1:分类讨论加速度情况(正负零)后二分处理

2:按照右端点排序(从小到大),然后在尽可能少右端点处开测速仪。

TIPS:

1:需要加快读

2:注意区间开闭!

3:精度!精度!精度题目都有暗示了,别开double!!!

4:别复制粘贴!改死你!

T3

缩点DP?

思路&实现:

设 dp[i][0/1] 表示当前填到第 i 个的情况。

1:放弃最后一个点,判断倒数第二个点是否已经确定与最后一个点不同

状态转移方程

dp[i][0]=max(dp[i][0],dp[i-1][0]);
dp[i][1]=max(dp[i][1],dp[i-1][0]);

2:然后特判处理特殊情况,ii-1 没被确定前可以与 i-1 相同,被确定时可以与 i-2 相同且转移到 i-1

状态转移方程

if(a[i]==a[i-1]) dp[i][0]=max(dp[i][0],dp[i-1][0]+a[i]);
if(a[i]==a[i-2]) dp[i][1]=max(dp[i][1],dp[i-1][1]+a[i]);

3:最后可以枚举上一个颜色相同的数,记录出所有满足<= i 且 a[j]=a[j+1] 的j的a[j]之和

状态转移方程

dp[i][1]=max(dp[i][1],maxi[a[i]]+c[i-2]+a[i]);
if(i>2) maxi[a[i-2]]=max(maxi[a[i-2]],dp[i-1][1]-c[i-2]);
dp[i][0]=max(dp[i][0],maxi[a[i]]+c[i-2]+a[i]);

TIPS:

实际上挺难想的,我们需要熟练地掌握暴力的20分。

T4

return 0;