【题解】CF9 合集
前言:
- 本人不会 LaTeX……请见谅
- 码风奇特,不喜勿喷哈
- 题面翻译取自 luogu,本蒟蒻也会安置原题链接
- 保证文章中不出现“显然”或者“注意到”,可能会出现“易证”
- AC 代码会放置在每一个题目的最底端,为防止 ban 码的情况出现,不设置跳转链接
- 有写错的地方欢迎各位神犇指正
- 本套题共 5 道,T1 水题,T2 坑题,T3 板子题,T4 思维题,T5 水题(蓝题虚高?),预计阅读时间小于 20min
正片开始!
CF9A
题面(可从下方链接跳转看原题题面):
小 Y,小 W 和小 D 进行扔骰子(六面)游戏,谁投出的点数最大算谁胜利,现在已知小 Y 和小 W 的得分,请你帮小 D 求出她获胜的概率
注意:
1.以"分子/分母"输出,特别的,若不可能获胜输出"0/1",100% 获胜输出"1/1"
2.小 Y 和小 W 非常绅士,如果小 D 的得分和他们一样,他们也会算作小 D 获胜
序言 & 结论:
直接做……
推理过程:
- 取 max(n,m)
- 枚举小 D 六个面,输出概率
细节处理:
代码:
……做完了
点击查看代码
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n,m;
scanf("%d%d",&n,&m);
int mx=max(n,m);
if(mx==1){
printf("1/1\n");
}else if(mx==2){
printf("5/6\n");
}else if(mx==3){
printf("2/3\n");
}else if(mx==4){
printf("1/2\n");
}else if(mx==5){
printf("1/3\n");
}else if(mx==6){
printf("1/6\n");
}
return 0;
}
----------------------------云落的分割线
----------------------------
CF9B
题面(可从下方链接跳转看原题题面):
鉴于翻译不具有可读性,故不展示中文题面
序言 & 结论:
本以为是个简单浮点数计算,愣是卡了我 1h
难度:橙题(但是很坑)
推理过程:
- 暴力枚举每一个站台下车,再由学生步行到学校算最小值……完了吗?
- 复杂度 O(n),所以 n 的范围实在是太小了
细节处理:
- 首先,不能在起点站下车
- 其次,如果有多个满足的下车地点,请输出离考试地点最近的一个。所以我们需要存下离站点最近的点进行比对
代码:
猜猜我放的是不是 AC 代码捏?
点击查看代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=128;
int n,vb,vs,a[maxn],ex,ey;
inline double dis(int x){
return x*1.0/vb+sqrt((ex*1.0-x)*(ex*1.0-x)+ey*1.0*ey)*1.0/vs;
}
int solve(){
int res=2;
double mn=dis(a[2]);
for(int i=3;i<=n;++i){
double tp=dis(a[i]);
if(tp<mn||tp==mn&&abs(ex-a[i])<abs(ex-a[res])){
mn=tp;
res=i;
}
}
return res;
}
int main(){
scanf("%d%d%d",&n,&vb,&vs);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
scanf("%d%d",&ex,&ey);
int ans=solve();
printf("%d\n",ans);
return 0;
}
----------------------------云落的分割线
----------------------------
CF9C
题面(可从下方链接跳转看原题题面):
输入 n,输出 1~n 的自然数中各数位只包含 0 和 1 的数的个数
序言 & 结论:
难度:橙题
dfs 裸题
打表也是可以的,反正就是512个数
推理过程:
- 在十进制下,只包含 {0,1} 的数的必要条件是模 10 余 0 或模 10 余 1
- 换言之,这些数一定等于一个 x10 或 x10+1
- 考虑 x 的性质:初始为 1,符合“只包含 {0,1}”的性质
- 搜索树已经不知不觉被我们建出来了
细节处理:
- 边界条件:x<n
- 打表的行为是不好的哦!
代码:
讲的很详细了,注释就不写了
点击查看代码
#include<iostream>
#include<cstdio>
using namespace std;
int n,ans;
inline void dfs(int x){
if(x>n){
return;
}
ans++;
dfs(x*10);
dfs(x*10+1);
return;
}
int main(){
scanf("%d",&n);
dfs(1);
printf("%d\n",ans);
return 0;
}
----------------------------云落的分割线
----------------------------
CF9D
题面(可从下方链接跳转看原题题面):
用 n 个点组成二叉树,问高度大于等于 h 的有多少种本质不同的二叉树
序言 & 结论:
每日 DP 放松放松
推理过程:
- 统计个数的题目,考虑 DP
- 按照题意设计状态,钦定 dp[i][j] 表示由 i 个点组成高度不超过 j 的二叉树数量
显然有:ans=dp[n][n]-dp[n][h-1]- 考虑转移
- 枚举左子树结点数量 k,则右子树节点数量为 i-k-1
- 那么方案数就是 dp[k][j-1]*dp[i-k-1][j-1]
- 转移方程出来了,撒花!
细节处理:
- 初始化 dp[0][j]=1
- 需要先遍历深度,再遍历节点数(先 j 后 i)
代码:
码量不大,思维含量高,好题!
点击查看代码
#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
const int maxn=36;
int n,h,dp[maxn][maxn];
signed main(){
scanf("%lld%lld",&n,&h);
for(int i=0;i<=n;i++){
dp[0][i]=1;
}
for(int j=1;j<=n;j++){
for(int i=1;i<=n;i++){
for(int k=0;k<j;k++){
dp[i][j]+=dp[k][j-1]*dp[i-k-1][j-1];
}
}
}
printf("%lld\n",dp[n][n]-dp[n][h-1]);
return 0;
}
----------------------------云落的分割线
----------------------------
CF9E
题面(可从下方链接跳转看原题题面):
给出 n 个点,m 条边,问是否能通过加一些边,使得 n 个点构成有且仅有 n 条边的单个环。如果能,输出 YES 以及加上的边的条数,并按字典序打印加上的边的两个端点。如果有多组解,输出字典序最小的一种方法。否则输出 NO 即可
序言 & 结论:
难度:蓝题?
前置知识:并查集判环
推理过程:
- 先连边,并且钦定 u 的父亲是 v
- 判断是否存在连边方式使图变为 n 元环的条件如下:
- m<n
- 连边前要保证所有点度数小于等于 2
- 连边后要保证所有点度数等于 2
- 图联通(否则可能会出现多个环)
- 顺次判断即可,用并查集维护
细节处理:
- 注意字典序最小
- “YES”“NO”均大写
代码:
备花!
点击查看代码
#include<iostream>
#include<cstdio>
#include<vector>
#include<utility>
#define pii pair<int,int>
#define fi first
#define se second
#define mkp make_pair
using namespace std;
const int maxn=64;
int n,m;
int deg[maxn],fa[maxn];
vector<pii> ans;
inline int find(int x){
if(fa[x]==x){
return x;
}
return fa[x]=find(fa[x]);
}
int main(){
scanf("%d%d",&n,&m);
if(n<m){
printf("NO\n");
return 0;
}
for(int i=1;i<=n;i++){
fa[i]=i;
}
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
int fu=find(u),fv=find(v);
fa[fu]=fv;
deg[u]++;
deg[v]++;
}
for(int i=1;i<=n;i++){
if(deg[i]>2){
printf("NO\n");
return 0;
}
}
for(int i=1;i<=n-1;i++){
for(int j=i+1;j<=n;j++){
int fx=find(i),fy=find(j);
if(fx!=fy&°[i]<2&°[j]<2){
fa[fx]=fy;
deg[i]++;
deg[j]++;
ans.push_back(mkp(i,j));
}
}
}
if(m+ans.size()==n-1){
int x,y;
for(int i=1;i<=n;i++){
if(deg[i]<=1){
x=i;
deg[i]++;
break;
}
}
for(int j=x;j<=n;j++){
if(deg[j]<=1){
y=j;
deg[j]++;
break;
}
}
ans.push_back(mkp(x,y));
}
for(int i=2;i<=n;i++){
if(find(i)!=find(1)){
printf("NO\n");
return 0;
}
}
printf("YES\n");
printf("%d\n",ans.size());
for(int i=0;i<ans.size();i++){
printf("%d %d\n",ans[i].fi,ans[i].se);
}
return 0;
}
完结撒花!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具