我竟然参加了这次比赛,只拿了二等奖QAQ
题单
1.幸运数字
题目描述
如果把一个数字十进制表示的奇数位和偶数位分别相加得到的和相同,小小就认为它是一个幸运的数字。例如:
-
奇数位相加
、偶数位相加
,因此
不是幸运数字;
-
奇数位相加
、偶数位相加
,因此
是幸运数字。
对于给定的 和
,小小希望你求出
中幸运数字的数量。
输入格式
输⼊数据仅一行,包含空格分隔的两个整数 和
。
输出格式
输出一行一个整数,代表 中幸运数字的数量。
分析:
-
定义函数check判断是否为幸运数字
-
循环便利x到y之间的数,记录幸运数字的数量并输出.
代码实现:
#include<bits/stdc++.h>
using namespace std;
bool check(int x){
int a=0,b=0,t=0;//a,b为奇·偶数位和,t用来判断数位是奇是偶
while(x){
t++;
if(t%2==0)a+=x%10;//a加上这一位的数
else b+=x%10;//否则b加上这一位的数
x/=10;
}
if(a==b)return true;//判断ab是否相等
return false;
}
int main(){
int x,y,ans=0;
cin>>x>>y;
for(int i=x;i<=y;i++)if(check(i))ans++;
cout<<ans;
return 0;
}
2.精密计时
题目描述
小小有一个非常精密的计时器,每秒可以计数 100 次 (两个连续的时钟计数之间恰好间隔百分之一秒)。例如,以下是从 到
的计时过程:
13:01:02.37 (13 时 1 分 2 秒.37)
13:01:02.38
13:01:02.39
...
13:01:02.98
13:01:02.99 (13 时 1 分 2 秒.99)
13:01:03.00 (13 时 1 分 3 秒.00)
13:01:03.01
小小记录了计时器上的两个时刻,你能帮助他计算这两个时刻之间经过了多少个 “百分之一秒”吗?
输入格式
输入数据仅一行,包含空格分开的两个字符串,代表了两个计时器上显示的时刻。时刻中的时、分、秒、百分之一秒均使用两位十进制数字表示,不足两位时在十位添零。时、分、秒之间用冒号 :
分隔,秒和百分之一秒之间用小数点 .
分隔。
输出格式
输出一行一个整数,代表两个时刻之间经过的 “百分之一秒” 数。
分析:
将两个时间都转换为分钟,直接相减即可。
可以使用scanf进行输入,但每个变量前都要加上&
代码实现:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c,d,e,f,g,h;
scanf("%d:%d:%d.%d %d:%d:%d.%d",&a,&b,&c,&d,&e,&f,&g,&h);
cout<<e*360000+f*6000+g*100+h-(a*360000+b*6000+c*100+d);
return 0;
}
3.图像重建
题目背景
JWST (詹姆斯·韦伯太空望远镜,James Webb Space Telescope) 是一台红外波段的大型太空望远镜,由美国国家航空航天局 (NASA)、欧洲航天局 (ESA) 和加拿⼤航天局 (CSA) 共同合作开发。它是哈勃太空望远镜的科学继任者,旨在解决⼀系列重要的天文学问题,包括宇宙的起源、星系的形成和演化、恒星和行星系统的形成,以及寻找宜居⾏星和生命迹象。
以下是 JWST 望远镜 5 ⽉ 23 ⽇采集的深空图像:
题目描述
太空望远镜在采集数据时,并不像我们日常生活中的手机或相机 “一次拍摄成像” 直接从传感器数据得到照⽚,而是由多次不同时段拍摄的图像拼接而成。在这个问题中,我们也来实现图像的拼接重建。
我们已经对⼀个区域拍摄了两张黑白图像。这两张图像面向同⼀区域拍摄,因此我们预期它们有相当⼀部分都是重叠的。你的任务就是将两张图像经过上下左右平移后尽可能 “重叠” 在⼀起,满⾜重叠部分所有像素均完全相同,且重叠部分的⾯积尽可能⼤(即重叠部分的像素数量尽可能多)。
输入格式
输入数据由两张图像的描述组成。两张图像的描述之间有一 个空行。
对于每张图像,第一行包含两个整数 和
,代表了图像的尺寸(像素的行数和列数)。接下来
⾏,每行
个像素描述了拍摄的图像,其中
表示一个黑色像素,
表示一个白色像素。每一行的像素由一个空格分隔。
输出格式
输出一行一个整数,即经过最优平移后,重叠部分的像素数量。
说明/提示
对于 的数据,满足
。
本题原始满分为
分析:
先看数据范围,,所以可以考虑直接暴力枚举
-
输入两个数组(不多解释了)
-
将横轴从
枚举到
,将纵轴从
枚举到
,再依次判断重叠部分是否相同。(具体内容请挪步注释)
-
输出
代码实现(显得非常冗长):
#include<bits/stdc++.h>
using namespace std;
int n1,m1,n2,m2,a[55][55],b[55][55],maxv=INT_MIN;
int main(){
cin>>n1>>m1;
for(int i=1;i<=n1;i++)
for(int j=1;j<=m1;j++)
cin>>a[i][j];
cin>>n2>>m2;
for(int i=1;i<=n2;i++)
for(int j=1;j<=m2;j++)
cin>>b[i][j];
for(int i=-n1;i<=n1;i++)
for(int j=-m1;j<=m1;j++){
int tmp=0;
for(int k=1;k<=n1;k++){
bool flag=false;//flag用于判断重叠部分是否相同
for(int l=1;l<=m1;l++){
int x=k+i,y=j+l;//移动后的位置
if(x>=1&&x<=n2&&y>=1&&y<=m2){//
if(a[k][l]!=b[x][y]){
flag=true;
tmp=0;
break;//不满足条件就标记flag并结束此循环
}
else tmp++;
}
}
if(flag)break;
}
maxv=max(maxv,tmp);//更新最大像素数量
}
cout<<maxv<<endl;
return 0;
}
未完待更