【题解】CF9 合集

前言:

  1. 本人不会 LaTeX……请见谅
  2. 码风奇特,不喜勿喷哈
  3. 题面翻译取自 luogu,本蒟蒻也会安置原题链接
  4. 保证文章中不出现“显然”或者“注意到”,可能会出现“易证”
  5. AC 代码会放置在每一个题目的最底端,为防止 ban 码的情况出现,不设置跳转链接
  6. 有写错的地方欢迎各位神犇指正
  7. 本套题共 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 元环的条件如下:
    1. m<n
    2. 连边前要保证所有点度数小于等于 2
    3. 连边后要保证所有点度数等于 2
    4. 图联通(否则可能会出现多个环)
  • 顺次判断即可,用并查集维护

细节处理:

  • 注意字典序最小
  • “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&&deg[i]<2&&deg[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;
}

完结撒花!

posted @   sunxuhetai  阅读(115)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示