CF51(详细版)

前言:

  1. 前几题无代码,讲解简略(直接模拟有什么好讲的)
  2. 被小学妹说题解简略,遂贴了核弹的题解模板
    3.核弹和小学妹会 lct 好巨好巨
    正片开始!

CF 51 A

题面(可从下方链接跳转看原题题面):

题目传送门

结论:

模拟题

完结撒花!

--------------------分割线--------------------

CF 51 B

题面(可从下方链接跳转看原题题面):

题目传送门

序言 & 结论:

模拟题

推理过程:

table /table 的处理和括号匹配一样,可以用栈实现,栈存表格的编号。碰到 table 就加 1 个表格进去,碰到 /table 就弹出栈顶。每次碰到 td 就给当前栈顶的表格加 1 。碰到 /td tr /tr 就跳过。

细节处理:

全是细节

完结撒花!

--------------------分割线--------------------

CF 51 C

题面(可从下方链接跳转看原题题面):

题目传送门

序言 & 结论:

贪心题

推理过程:

求最小距离,二分

记二分的距离为 d

第一个应该放在 a1+d

记不能覆盖的城市位置为 a

所以下一个要放在 a+d

放完 3 个判断最后一个城市是否能覆盖即可

完结撒花!

--------------------分割线--------------------

CF 51 D

题面(可从下方链接跳转看原题题面):

题目传送门

序言 & 结论:

其实就是让你整一个等比序列

推理过程:

注意 c b 是固定的

在前三个数中必定满足最多一个数字不合法。

也就是说,若成立,前三个数只可能是 a1 a2合法或 a1 a3 合法 a2 a3合法或都合法,这种情况与第一种合并。

这样我们就有了前两个合法数字,可以算出公比并判断后续是否合法。

细节处理:

要特判 0 的情况

实数!!!

代码:

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+6;
int n,s[N],kazuha;
double c,d;
int f(double a,double b){
    if(a==0)d=0;
    else d=b/a;
    int cnt=0;
    c=a;
    for(int i=1;i<=n;i++){
        if(cnt>=2)break;
        if(c==s[i])c*=d;
        else cnt++;
    }
    return cnt;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>s[i];
    kazuha=min(f(s[1],s[2]),(min(f(s[1],s[3]),f(s[2],s[3]))));
    cout<<kazuha;
    return 0;
}

完结撒花!

--------------------分割线--------------------

CF(填数字)E

题面(可从下方链接跳转看原题题面):

题目传送门

序言 & 结论:

求无向图五元环的个数

推理过程:

dp

dpi,j,k 表示 ij 距离为 k 的方案数

dpi,j,k=t=1ndpi,t,1dpt,j,k1

枚举 2 到 3 拼接

因为是双向边,并且是五元环,每个点来回都会被算一次,所以答案要除以 10。

但这之中有可能出现一个三元环加上一条无向边连着。

如何解决?

我们只需要枚举任意三元环,然后求出三个点的度,他们之间形成的假五元环的个数,就是他们度数和减去 3。

代码:

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N=705;
int n,m,f[N][N][6],in[N];
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b;
		f[a][b][1]++,f[b][a][1]++;
		in[a]++,in[b]++;
	}
	for(int t=2;t<=3;t++){
		for(int k=1;k<=n;k++){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					f[i][j][t]+=f[i][k][t-1]*f[k][j][1];
				}
			}
		}
	}
	int kazuha=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			kazuha+=f[i][j][2]*f[i][j][3];
		}
	}
	kazuha/=10;
	for(int i=1;i<=n;i++){
		for(int j=1;j<i;j++){
			if(!f[i][j][1])continue;
			for(int k=1;k<j;k++){
				if(!f[i][k][1]||!f[k][j][1])continue;
				kazuha-=in[i]+in[j]+in[k]-3;
			}
		}
	}
	cout<<kazuha;
	return 0;
}

完结撒花!

posted @   小惰惰  阅读(22)  评论(4编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
/* 鼠标点击求赞文字特效 */
点击右上角即可分享
微信分享提示