考试报告-1
我的主页
P1378 油滴扩展
涉及算法/考点:
全排列
解题思路:
全排列枚举所有顺序,计算。n很小,全排列复杂度并不会超时,不需要优化
解题关键点:
摆放油滴不同的顺序会产生不同的结果,需要列举出全部可能性再逐一比较
易错点/出现的错误总结:
- 计算半径时,可能出现负数,要赋值为
0 -
- 摆放的第i个油滴的下标并不是[i]
通用技巧总结:
-
-
### 类比题目: 全排列
P1069 [NOIP2009 普及组] 细胞分裂
涉及算法/考点:
整除
解题思路:
一个数可以拆分成
如果
那么
所以对于每一个
最终答案:
解题关键点:
把整除转换一下
易错点/出现的错误总结:
- 当
m1=1 时直接输出1 - 当
m1 或s_i 是质数时要把他自己放进去
通用技巧总结:
把整除转换一下
自信即巅峰
P1970 [NOIP2013 提高组] 花匠
涉及算法/考点:
解题思路:
假设
那么
结果就是
初始值:
解题关键点:
分类讨论
易错点/出现的错误总结:
搞混/搞错/搞反两种情况QwQ
通用技巧总结:
分类讨论:让“不可能”成为现实
看起来很离谱违反直觉的东西可能是正确的
P3405 [USACO16DEC]Cities and States S
就是地图
涉及算法/考点:
哈希
解题思路:
把城市名称的前两位转换成一个数
具体方法:
如果几个城市的省会和名称的前两位都一样,那为什么还要一个一个算呢
优化方法:对于每个城市,进行以下操作:
anss[a[i].fst][a[i].sec]++
统计答案:
for(int i=0;i<n;i++){
if(a[i].fst==a[i].sec)continue;
ans+=anss[a[i].sec][a[i].fst];
}
解题关键点:
易错点/出现的错误总结:
- 判断一个城市有没有和他自己配对
- 判断两个城市是不是在一个省
这两个问题只需要判断一次即可
就是判断a_i.fst\ne a_i.sec
如果a_i.fst=a_i.sec ,那么本次循环一定会也只会判断到自己和同省的城市
假设有一个城市b 和城市a 是“友好城市”,那么a.fst=b.sec
如果a.fst=a.sec
那么a.sec=b.sec ,是同省城市
自己和自己当然也是同省啦 - 最终结果会爆int(结果最大接近于
2\times10^{10} )
方法:开long long
通用技巧总结:
好好读题
代码
#include<bits/stdc++.h>
using namespace std;
int anss[750][750];
long long ans;
int n;
struct node{
int fst,sec;
};
char fc[20],sc[10];
node a[200010];
int main(){
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%s%s",fc,sc);
a[i]={(fc[0]-'A')*26+fc[1]-'A',(sc[0]-'A')*26+sc[1]-'A'};
++anss[a[i].fst][a[i].sec];
}
for(int i=0;i<n;++i){
if(a[i].fst==a[i].sec)continue;
ans+=anss[a[i].sec][a[i].fst];
}
cout<<(ans>>1);
}
P5683 [CSP-J2019 江西] 道路拆除
就是道路拆除
涉及算法/考点:
最短路(
解题思路:
从点
枚举一个点
答案就是
那么求出的最短路之和不是可能会有重复计算吗
就是这样
在这里 边
但是别忘了我们会枚举所有的点做中转点
在这里(点
而且因为边权都是
解题关键点:
把问题转化成三个最短路
易错点/出现的错误总结:
把小于等于打成小于
把1-n的循环写成0-n-1
通用技巧总结:
多次(正向+反向)最短路
P5682 [CSP-J2019 江西] 次大值
涉及算法/考点:
还是整除
解题思路:
我们只需要取出
最大值一定是
因为最大的模数是
也不可能有大于等于
解题关键点:
发现有好多好多个没有意义的
易错点/出现的错误总结:
- 会不会没有两个不同的余数呢
就是得到的余数去重之后数量小于3
用样例就可以测出来
通用技巧总结:
分类讨论
P1314 [NOIP2011 提高组] 聪明的质监员
涉及算法/考点:
- 二分
- 前缀和
解题思路:
二分枚举
对于每次二分出来的
设
设
在对每个区间
再和s比较
解题关键点:
- 看出他是二分
求出|y-s| 的最小值 - 看出他是前缀和
多次查询区间[l,r] 之间的和
易错点/出现的错误总结:
- 看不懂
\sum
百度百科 - 看不懂
[w_j \ge W]
他表示的是当里面的条件成立时为1 否则为0
百度百科为什么没有呢
通用技巧总结:
- 二分的适用情况
最小化最大值/最大化最小值
求一个合适的值 - 前缀和的适用情况
多次询问 区间求和$sum(l,r)=qzh_r-qzh_{l-1} 类比题目
P2280 [HNOI2003]激光炸弹
P1873 [COCI 2011/2012 #5] EKO / 砍树
P5018 [NOIP2018 普及组] 对称二叉树
涉及算法/考点:
深搜
解题思路:
从每个节点出发
搞一个
当
如果
如果 当
如果
如果
如果前面都不成立 返回
再跑一遍计算子树大小 取最大值
解题关键点:
每个
因为如果要让他递归很多次就要让树接近一个满二叉树或者一条链
满二叉树最多有
链的话只要递归几层就可以判断出来他不是对称的
所以看起来
易错点/出现的错误总结:
为什么我没想到可以同时跑两边QwQ
通用技巧总结:
自信即巅峰
暴力出奇迹
P1077 [NOIP2012 普及组] 摆花
涉及算法/考点:
类似于背包
解题思路:
- 状态定义
设dp_{i,j} 为考虑了前i 种花 总数为j 的方案数 - 转移
dp_{i,j}=dp_{i-1,j-k}(1\le k\le max(a_i,j)) 因为一种花最多连续放
a_i 盆 - 代码
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
for(int k=0;k<=j&&k<=a[i];k++){
dp[i][j]+=dp[i-1][j-k];
dp[i][j]%=ms;
}
}
}
解题关键点:
把本题转换成“背包”
通用技巧总结:
把不熟悉的问题转换成熟悉的问题