【题解】CF1 合集

前言:

  1. 本人不会 LaTeX……请见谅
  2. 码风奇特,不喜勿喷哈
  3. 题面翻译取自 luogu,本蒟蒻也会安置原题链接
  4. 保证文章中不出现“显然”或者“注意到”,可能会出现“易证”
  5. AC 代码会放置在每一个题目的最底端,为防止 ban 码的情况出现,不设置跳转链接
  6. 有写错的地方欢迎各位神犇指正
  7. 本套题共 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”型,否则为“字母+数字”型

  • 处理字符串

    1. “RXCY”型
    • X 是没有任何贡献的,直接 copy
    • 对于这个 Y,考虑十进制转二十六进制
    • 短除,倒取余数
    1. “字符+数字”型
    • 数字是没有任何贡献的,直接 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;
}

完结撒花!

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