【题解】CF1 合集
前言:
- 本人不会 LaTeX……请见谅
- 码风奇特,不喜勿喷哈
- 题面翻译取自 luogu,本蒟蒻也会安置原题链接
- 保证文章中不出现“显然”或者“注意到”,可能会出现“易证”
- AC 代码会放置在每一个题目的最底端,为防止 ban 码的情况出现,不设置跳转链接
- 有写错的地方欢迎各位神犇指正
- 本套题共 3 道,预计阅读 + 理解时间小于 40min
正片开始!
CF1A
题面(可从下方链接跳转看原题题面):
翻译:
贝尔兰首都的剧院广场呈矩形,尺寸为 n×m。在该市周年纪念日之际,人们决定用正方形的花岗岩石板铺设广场。每块石板的尺寸为 a×a。
铺砌广场所需的石板最少数量是多少?石板可以覆盖比剧院广场更大的表面,但必须覆盖广场。不允许打碎石板。石板的边应与广场的边平行。
序言 & 结论:
难度:红题
结论:ans = 横行至少放置砖块数 * 竖列至少放置砖块数
推理过程:
咕了咕了~
xxs 都会写的题目(毕竟 CF1A 的地位等同于洛谷的超级玛丽游戏,咳咳)
细节处理:
- 注意整除即可
- 一定不要开 long long,不然你会 AC
代码:
签到一下,快速过吧!
点击查看代码
#include<iostream>
#define int long long
using namespace std;
int n,m,a;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>a;
int x=(n+a-1)/a,y=(m+a-1)/a;
cout<<x*y<<endl;
return 0;
}
完结撒花!
--------------------我是华丽的分割线--------------------
CF1B
题面(可从下方链接跳转看原题题面):
翻译:
人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统:
第一列被标为 A,第二列为 B,以此类推,第 26 列为 Z。接下来为由两个字母构成的列号: 第 27 列为 AA,第 28 列为 AB……在标为 ZZ 的列之后则由三个字母构成列号,如此类推
行号为从 1 开始的整数
单元格的坐标由列号和行号连接而成。比如,BC23 表示位于第 55 列 23 行的单元格
有时也会采用被称为 RXCY 的坐标系统,其中 X 与 Y 为整数,坐标 (X,Y) 直接描述了对应单元格的位置。比如,R23C55 即为前面所述的单元格
您的任务是编写一个程序,将所给的单元格坐标转换为另一种坐标系统下面的形式
序言 & 结论:
吐槽时间:
难度:橙题
知识点:字符串处理、进制转换
P.S. 我讨厌虚空调试!
推理过程:
-
对于一个输入的字符串,我们要对其分类(RXCY 或 字母+数字)
-
分类的方式五花八门,介绍我使用的
-
若字符串出现数字后面连接一个“C”,则为“RXCY”型,否则为“字母+数字”型
-
处理字符串
- “RXCY”型
- X 是没有任何贡献的,直接 copy
- 对于这个 Y,考虑十进制转二十六进制
- 短除,倒取余数
- “字符+数字”型
- 数字是没有任何贡献的,直接 copy
- 对于由字符构成的前缀,考虑二十六进制转十进制
- 按权相加
-
输出答案,完结撒花!
细节处理:
- 如果你已经按照“推理过程”急不可耐地敲上代码了,你大概会和我一样 Wrong answer at test 6
- 为什么嘞?
- 考虑 Z 的取模是 0,如果不加特判会快乐的返回一个 @
- 然后就无了(本蒟蒻就是这么水灵灵地 WA 了半个小时……)
- 注意一下下标(小于 vs 小于等于,i vs i-1 vs i+1)
代码:
本来不想给的,我要看别人虚空调试!
点击查看代码
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
const int maxn=1e6+10;
char s[maxn],ss[maxn];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
while(n--){
cin>>s;
int num1=0,num2=0;
if(s[0]=='R'){
int i=1;
while(isdigit(s[i])){
num1=num1*10+s[i++]-'0';
}
if(i>1&&s[i]=='C'){
i++;
while(isdigit(s[i])){
num2=num2*10+s[i++]-'0';
}
int j=0;
while(num2>0){
ss[++j]=(num2-1)%26+'A';
if(num2%26==0){
num2=num2/26-1;
}else{
num2/=26;
}
}
for(;j>=1;j--){
if(isupper(ss[j])){
cout<<ss[j];
}
}
cout<<num1<<endl;
continue;
}
}
int i=0;
num1=0,num2=0;
while(isupper(s[i])){
num2=num2*26+s[i++]-'A'+1;
}
while(isdigit(s[i])){
num1=num1*10+s[i++]-'0';
}
cout<<'R'<<num1<<'C'<<num2<<endl;
}
return 0;
}
完结撒花!
--------------------我是华丽的分割线--------------------
CF1C
题面(可从下方链接跳转看原题题面):
翻译:
现在所有的马戏团在 Berland 都有一个直径 13 米的圆形竞技场, 但在过去的事情是不同的。
在古代 Berland 竞技场的马戏团被塑造成一个规则 (等角) 多边形, 角色的大小和角度可能因马戏团而异。竞技场的每个角落都有一根特别的柱子, 柱子之间的绳子标记着竞技场的边缘
最近, 来自 Berland 的科学家发现了古代马戏团竞技场的遗迹。他们发现只有三根柱子, 其他的被毁坏了
你得到了这三根柱子的坐标。请找出竞技场中最小的区域
输入三行,每行包含两个数字,表示柱子的坐标,坐标的绝对值不超过 1000,小数点后不超过 6 位
输出古代竞技场的可能的最小区域面积,精确到小数点后至少 6 位,保证在最佳答案中多边形角的数目不大于 100
序言 & 结论:
题面翻译一下:在所有的过给定三点的正多边形中,求最小面积
难度:蓝题(如果三角函数相关掌握的熟练,可以降黄?)
CF1 套题的重量级选手
推理过程:
- 给出一个结论,该多边形所有顶点均在三角形外接圆上,形如:
-
接下来是数学时间!
-
对于给定的坐标,我们可以求出三角形三边长度 a,b,c
dis=sqrt((x2-x1)·(x2-x1)+(y2-y1)·(y2-y1)) -
海伦公式求面积 S
令 p=(a+b+c)/2
S=sqrt(p·(p-a)·(p-b)·(p-c)) -
我们的目的是求出半径,其实这是一个二级结论:
R=abc/(4·S),S 表示三角形面积
不过我还是手推一下:由正弦定理,2R=a/sin(A)
可得,R=a/(2·sin(A))由三角形面积公式 S=0.5·b·h
S=0.5·b·c·sin(A)
移项得,sin(A)=S/(2·b·c)代入 R=a/(2·sin(A)),得 R=abc/(4·S)
-
求完半径,基本上完成一半了……
-
由余弦定理,计算 ∠AOB,∠AOC,∠BOC 的余弦值,再使用 arccos 反解其角度大小
-
对于求解最小正多边形面积,我们考虑使其边长最小,即中心角最大
-
由图可知,∠AOB,∠AOC,∠BOC 必然为中心角的倍数
-
故此中心角 T=gcd(∠AOB,∠AOC,∠BOC)
-
最后用正弦定理求面积即可,有:
ans=π·R·R·sin(T)/T;
细节处理:
- 警示后人,long double 会寄
- 涉及到浮点数取最大公约数,注意 fmod 的精度问题,不要设置精度过高的 eps
- pi 可以手敲 3.1415926……,也可以用 arccos(-1)
- arccos 函数在 C++ 中长这样 acos()
- 注意调用头文件 < cmath >
- 如若使用万能头,y1 是不合法的变量名,建议改成 y
- 控制 6 位小数输出
代码:
代码并不长,还是数学运算为主,难以理解公式可以画图辅助分析
点击查看代码
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps=1e-4,pi=acos(-1.000000);
double x,y,x2,y2,x3,y3,S,R;
inline double gcd(double a,double b){
if(fabs(b)<eps){
return a;
}
if(fabs(a)<eps){
return b;
}
return gcd(b,fmod(a,b));
}
inline double dis(double a,double b,double c,double d){
return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
inline double Heron(double a,double b,double c){
double p=(a+b+c)/2;
return sqrt(p*(p-a)*(p-b)*(p-c));
}
inline double get_angle(double x){
return acos(1-(x*x)/(2*R*R));
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>x>>y>>x2>>y2>>x3>>y3;
double a=dis(x,y,x2,y2),b=dis(x,y,x3,y3),c=dis(x2,y2,x3,y3);
S=Heron(a,b,c);
R=(a*b*c)/(4.0*S);
double angle1=get_angle(a),angle2=get_angle(b),angle3=2*pi-angle1-angle2;
double angle=gcd(angle1,gcd(angle2,angle3));
double ans=pi*R*R*sin(angle)/angle;
cout<<fixed<<setprecision(6)<<ans<<endl;
return 0;
}
完结撒花!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具