[信息与未来 2023] 精密计时
题目描述
小小有一个非常精密的计时器,每秒可以计数 100 次 (两个连续的时钟计数之间恰好间隔百分之一秒)。例如,以下是从 13 : 01 : 02.37 13:01:02.37 13:01:02.37 到 13 : 01 : 03.01 13:01:03.01 13:01:03.01 的计时过程:
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
小小记录了计时器上的两个时刻,你能帮助他计算这两个时刻之间经过了多少个 “百分之一秒”吗?
输入格式
输入数据仅一行,包含空格分开的两个字符串,代表了两个计时器上显示的时刻。时刻中的时、分、秒、百分之一秒均使用两位十进制数字表示,不足两位时在十位添零。时、分、秒之间用冒号 :
分隔,秒和百分之一秒之间用小数点 .
分隔。
输出格式
输出一行一个整数,代表两个时刻之间经过的 “百分之一秒” 数。
样例 #1
样例输入 #1
01:02:34.56 01:03:00.10
样例输出 #1
2554
样例 #2
样例输入 #2
00:00:00.00 23:59:59.99
样例输出 #2
8639999
提示
对于 100 % 100\% 100% 的数据,两个时刻都来自 24 24 24 小时制的同一天 ( 00 : 00 : 00.00 00:00:00.00 00:00:00.00 到 23 : 59 : 59.99 23:59:59.99 23:59:59.99),且保证后一个时刻晚于前一个时刻。
本题原始满分为 15 pts 15\text{pts} 15pts。
正解
按照题目,模拟一个进制计算。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a,b,c,d;
int e,f,g,h;
void solve()
{
scanf("%lld:%lld:%lld.%lld",&a,&b,&c,&d);
scanf("%lld:%lld:%lld.%lld",&e,&f,&g,&h);
int suma = d + c*100 + b*6000 + a*360000;
int sumb = h + g*100 + f*6000 + e*360000;
cout << sumb-suma;
}
signed main()
{
int TTT;
// cin >> TTT;
TTT = 1;
while (TTT--) solve();
return 0;
}
[信息与未来 2023] 幸运数字
题目描述
如果把一个数字十进制表示的奇数位和偶数位分别相加得到的和相同,小小就认为它是一个幸运的数字。例如:
-
12345 12345 12345 奇数位相加 1 + 3 + 5 = 9 1 + 3 + 5 = 9 1+3+5=9、偶数位相加 2 + 4 = 6 2 + 4 = 6 2+4=6,因此 12345 12345 12345 不是幸运数字;
-
2332 2332 2332 奇数位相加 2 + 3 = 5 2 + 3 = 5 2+3=5、偶数位相加 3 + 2 = 5 3 + 2 = 5 3+2=5,因此 2332 2332 2332 是幸运数字。
对于给定的 a a a 和 b b b,小小希望你求出 a , a + 1 , a + 2 , … , b a,a + 1, a + 2,\dots, b a,a+1,a+2,…,b 中幸运数字的数量。
输入格式
输⼊数据仅一行,包含空格分隔的两个整数 a a a 和 b b b。
输出格式
输出一行一个整数,代表 a , a + 1 , a + 2 , … , b a, a + 1, a + 2,\dots, b a,a+1,a+2,…,b 中幸运数字的数量。
样例 #1
样例输入 #1
1 100
样例输出 #1
9
样例 #2
样例输入 #2
4096 65536
样例输出 #2
3454
提示
- 对于 100 % 100\% 100% 的数据,满足 1 ≤ a ≤ b ≤ 1 0 6 1\leq a\leq b\leq 10^6 1≤a≤b≤106。
本题原始满分为 10 pts 10\text{pts} 10pts。
正解
模拟。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int sum;
void solve()
{
cin >> n >> m;
if (m == 1000000) m--;
for (int i = n;i <= m;i++)
{
int suma = i/100000 + i/1000%10 + i/10%10;
int sumb = i/10000%10 + i/100%10 + i%10;
if (suma == sumb) sum++;
}
cout << sum;
}
signed main()
{
int TTT;
// cin >> TTT;
TTT = 1;
while (TTT--) solve();
return 0;
}
[信息与未来 2023] 图像重建
题目背景
JWST (詹姆斯·韦伯太空望远镜,James Webb Space Telescope) 是一台红外波段的大型太空望远镜,由美国国家航空航天局 (NASA)、欧洲航天局 (ESA) 和加拿⼤航天局 (CSA) 共同合作开发。它是哈勃太空望远镜的科学继任者,旨在解决⼀系列重要的天文学问题,包括宇宙的起源、星系的形成和演化、恒星和行星系统的形成,以及寻找宜居⾏星和生命迹象。
以下是 JWST 望远镜 5 ⽉ 23 ⽇采集的深空图像:
题目描述
太空望远镜在采集数据时,并不像我们日常生活中的手机或相机 “一次拍摄成像” 直接从传感器数据得到照⽚,而是由多次不同时段拍摄的图像拼接而成。在这个问题中,我们也来实现图像的拼接重建。
我们已经对⼀个区域拍摄了两张黑白图像。这两张图像面向同⼀区域拍摄,因此我们预期它们有相当⼀部分都是重叠的。你的任务就是将两张图像经过上下左右平移后尽可能 “重叠” 在⼀起,满⾜重叠部分所有像素均完全相同,且重叠部分的⾯积尽可能⼤(即重叠部分的像素数量尽可能多)。
输入格式
输入数据由两张图像的描述组成。两张图像的描述之间有一个空行。
对于每张图像,第一行包含两个整数 n n n 和 m m m,代表了图像的尺寸(像素的行数和列数)。接下来 n n n ⾏,每行 m m m 个像素描述了拍摄的图像,其中 0 0 0 表示一个黑色像素, 1 1 1 表示一个白色像素。每一行的像素由一个空格分隔。
输出格式
输出一行一个整数,即经过最优平移后,重叠部分的像素数量。
样例 #1
样例输入 #1
3 3
0 0 0
0 1 1
0 1 1
2 4
1 1 0 0
1 1 0 1
样例输出 #1
4
提示
对于 100 % 100\% 100% 的数据,满足 1 ≤ n , m ≤ 50 1\leq n,m\leq 50 1≤n,m≤50。
本题原始满分为 15 pts 15\text{pts} 15pts。
正解
直接暴力枚举。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,x,y;
int a[55][55],b[55][55];
int mx;
void solve()
{
cin >> n >> m;
for (int i = 1;i <= n;i++) for (int j = 1;j <= m;j++) cin >> a[i][j];
cin >> x >> y;
for (int i = 1;i <= x;i++) for (int j = 1;j <= y;j++) cin >> b[i][j];
for (int i = -n;i <= n;i++)
for (int j = -m;j <= m;j++)
{
int sum = 0,f = 1;
for (int k = 1;k <= x;k++)
for (int l = 1;l <= y;l++)
{
int nx = k+i,ny = l+j;
if (nx < 1 || nx > n || ny < 1 || ny > m) continue;
if (a[nx][ny] != b[k][l])
{
f = 0;
break;
}
sum++;
}
mx = max(mx,sum*f);
}
cout << mx;
}
signed main()
{
int TTT;
// cin >> TTT;
TTT = 1;
while (TTT--) solve();
return 0;
}