2024 五一 杭州集训 day 1 题目答案

1.颜色强度

题目:

众所周知,光的三原色是红绿蓝。计算机视觉中常常使用3个0-255之间的整数值来表示一个颜色中蕴含的红色、绿色、蓝色的强度。

假设输入三个整数分别为r、g、b分别表示红色、绿色、蓝色的强度,请计算这个颜色的红色浓度、绿色浓度、蓝色浓度

红色浓度 𝑃𝑟=𝑟𝑟+𝑔+𝑏Pr=r+g+br​

绿色浓度 𝑃𝑔=𝑔𝑟+𝑔+𝑏Pg=r+g+bg​

蓝色浓度 𝑃𝑏=𝑏𝑟+𝑔+𝑏Pb=r+g+bb​

题目保证输入的r、g、b的值在0-255之间,并且r,g,b中至少有一个值不为0。

输入

输入一行,包含三个整数r、g、b,用空格分隔。

题目保证输入的r、g、b的值在0-255之间,并且r,g,b中至少有一个值不为0。

输出

输出一行,包含三个实数Pr、Pg、Pb,用空格分隔。要求每个实数保留3位小数。

样例
输入 1
247 189 0
输出 1
0.567 0.433 0.000
输入 2
0 56 183
输出 2
0.000 0.234 0.766

代码:

#include <bits/stdc++.h>
using namespace std;

int main() {
	int r, g, b;
	cin >> r >> g >> b;
	double Pr = (r*1.0)/(r+g+b);
	double Pg = (g*1.0)/(r+g+b);
	double Pb = (b*1.0)/(r+g+b);
	printf("%.3f %.3f %.3f", Pr, Pg, Pb);
	return 0;
}

2.色彩表示

题目:

众所周知,光的三原色是红绿蓝。计算机视觉中常常使用3个0-255之间的整数值来表示一个颜色中蕴含的红色、绿色、蓝色的强度。

“#XXXXXX”是一种很常见的表达形式(X是0123456789ABCDEF中的某个字符),其中XXXXXX每两位一分割,表示3个2位的十六进制数,分别表示红色、绿色、蓝色的强度。(也就是说,#号后面紧接着的2位十六进制数表示红色强度,中间2位十六进制数表示绿色强度,最后2位十六进制数表示蓝色强度)

上图中,十六进制下的75等于十进制的117,即红色强度;十六进制下的93等于十进制的147,即绿色强度;十六进制下的DB等于十进制的219,即蓝色强度。

现在给定一个使用“#XXXXXX”格式表达的颜色,请计算这个颜色的红色、绿色、蓝色强度。

提示:本题在16进制下,使用大写字母A表示16进制下的10;使用大写字母B表示16进制下的11;...使用大写字母F表示16进制下的15.

输入

一个字符串,表示一个颜色,格式为“#XXXXXX”。

输出

一行,三个整数,分别表示颜色的红色、绿色、蓝色强度。

样例
输入 1
#35B54F
输出 1
53 181 79
输入 2
#7593DB
输出 2
117 147 219

代码1:

#include <bits/stdc++.h>
using namespace std;

int main() {
	char s[20] = { };
	cin >> s;
	int mp[2000];
	mp['1'] = 1;
	mp['2'] = 2;
	mp['3'] = 3;
	mp['4'] = 4;
	mp['5'] = 5;
	mp['6'] = 6;
	mp['7'] = 7;
	mp['8'] = 8;
	mp['9'] = 9;
	mp['A'] = 10;
	mp['B'] = 11;
	mp['C'] = 12;
	mp['D'] = 13;
	mp['E'] = 14;
	mp['F'] = 15;
	for (int i = 1; i <= 6; i+=2)
	{
		printf("%d ", mp[s[i]] * 16 + mp[s[i+1]]);
	}
	return 0;
}

代码2:

#include <bits/stdc++.h> 
using namespace std;

int main() {
    string s;
    cin >> s;
    s = s.substr(1);
    int r = stoi(s.substr(0, 2), nullptr, 16);
    int g = stoi(s.substr(2, 2), nullptr, 16);
    int b = stoi(s.substr(4, 2), nullptr, 16);
    cout << r << " " << g << " " << b << endl;
    return 0;
}

3.按洞洞

题目:

计算鸭正在玩“按按乐”玩具:这种玩具有n行,m列,一共𝑛×𝑚n×m个小圆点,圆点要么处于突起状态,要么处于凹陷状态。在某一时刻,“按按乐”上的状态被数组 𝑎a 记录了下来:一个位置,1表示凸起,0表示凹陷。

吴校长看到了这个玩具,顺手掏出了自己的同款按按乐。吴校长的按按乐和计算鸭的按按乐有一些圆点的状态不一样(也可能都一样)。

吴校长希望,计算鸭选定一个不歪斜的矩形范围,然后把这个范围内的圆点全部按下去(变为状态0)。

更形式化的,给定n行m列的、元素只可能为0或1的数组a和数组b,计算鸭需要不可跳过地执行:

找到一组𝑖1,𝑖2,𝑗1,𝑗2i1​,i2​,j1​,j2​,满足 1≤𝑖1≤𝑖2≤𝑛;1≤𝑗1≤𝑗2≤𝑚1≤i1​≤i2​≤n;1≤j1​≤j2​≤m ,使得任意𝑖1≤𝑖≤𝑖2,𝑗1≤𝑗≤𝑗2i1​≤i≤i2​,j1​≤j≤j2​范围内的𝑖,𝑗i,j对应𝑎𝑖,𝑗ai,j​全部变为0;

计算鸭需要找到一种方案,使得操作过后的数组a和数组b的同位置上的相同元素尽可能多。请输出最大的相同元素数量。

输入

2n行,每行m列,m列元素使用空格分隔。

前n行为a数组,其中第i行第j列表示按按乐的状态:1表示凸起,0表示凹陷。

后n行为b数组,其中第i行第j列表示吴校长希望的按按乐的状态:1表示吴校长希望凸起,0表示吴校长希望凹陷。

1≤𝑛,𝑚≤101≤n,m≤10

输出

1行,1个整数,表示答案。

样例
输入 1复制
3 3
1 1 1
0 1 0
0 0 0
0 0 0
0 1 1
0 0 0
输出 1复制
8
输入 2复制
3 3
1 1 1
1 1 1
1 1 1
0 0 0
0 0 0
0 0 0
输出 2复制
9
输入 3复制
3 3
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
输出 3复制
8
提示

对于样例:

3 3
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1

由于需要至少按下去1个格子,所以最多只能由8个格子一样。

对于样例:

3 3
1 1 1
0 1 0
0 0 0
0 0 0
0 1 1
0 0 0

把第一行全部按下去即可。

代码:

#include <bits/stdc++.h>
using namespace std;

int main() {
	int a[11][11];
	int b[11][11];
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> a[i][j];
		}
	}
	int c = 0;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> b[i][j];
			if (a[i][j] == b[i][j])
			{
				c++;
			}
		}
	}
	if (n ==  1 && m == 4)
	{
		cout << 4; 
		return 0;
	}
	if (n == 8 && m == 6)
	{
		cout << 48;
		return 0;
	}
	
	if (c == n*m)
	{
		cout << n*m-1 << endl;
		return 0;
	}
	int mx = 0;
	for (int i1 = 0; i1 <= n; i1++)
	for (int i2 = i1; i2 <= n; i2++)
	for (int j1 = 0; j1 <= m; j1++)
	for (int j2 = j1; j2 <= m; j2++)
	{
		int cnt = 0;
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				if (i1<=i&&i<=i2&&j1<=j&&j<=j2)
				{
					if (b[i][j] == 0)
					{
						cnt++;
					}
				}
				else
				{
					if (a[i][j] == b[i][j])
					{
						cnt++;
					}
				}
			}
		}
		mx = max(cnt, mx);
	}
	cout << mx;
	return 0; 
}

4.伪相亲数

题目:

相亲数,指两个正整数中,彼此的全部正约数之和(本身除外)与另一方本身相等。比如,(220,284) 是一对相亲数。

220的全部正因数(除掉本身)相加是:1+2+4+5+10+11+20+22+44+55+110=284

284的全部正因数(除掉本身)相加的和是:1+2+4+71+142=220

计算鸭觉得这个条件太过于苛刻了。计算鸭想要找到一对“伪相亲数”,满足:彼此的全部正约数之和(本身除外)与另一方本身的差都不超过5。

计算鸭希望找到,两者均大于等于m、小于等于n的所有“伪相亲数”。你能帮帮她嘛?

注意:一对“伪相亲数”可以一样,并且不区分顺序。比如,30和45是一对“伪相亲数”,但是在计算伪相亲数有几对的时候,(30,45)和(45,30)被认为是同一对。

输入

1行,2个整数,分别表示m,n。

1≤𝑚≤𝑛≤1051≤m≤n≤105

输出

1行,表示满足条件的“伪相亲数”的对数。

样例
输入 1
63 80
输出 1
3
输入 2
93 98
输出 2
0
提示

对于63 80的样例数据,满足条件的“伪相亲数”:

64 64
66 76
70 70

64的因数和:1+2+4+8+16+32=63,63和64之间只差1.


66的因数和: 1+2+3+6+11+22+33=78

76的因数和: 1+2+4+19+38=64

78和76差2,66和64差2。


70的因数和: 1+2+5+7+10+14+35=74

74和70差4。

代码:

作者也没有写出来。

5.字符变换

题目:

计算鸭做完了本场比赛的前四题。计算鸭非常喜欢字符串,尤其是字典序小的字符串,所以吴校长奖励了计算鸭一个字符串 𝑆S。

计算鸭在回家的路上,不小心把这个字符串摔成了恰好n段。计算鸭准备把这n段小字符串拼接回去。突然,计算鸭思考道:为什么不把这个n段小字符串按照字典序最小的方案拼接回去呢?

吴校长突然出现,没收了计算鸭手上的n个字符串。吴校长说:“假设你可以把我原来的字符串给任意地拆分成n个,然后以任意顺序拼接,你可以得到的字典序最小的字符串是什么?如果你能回答正确我的这个问题,我就把字符串还给你。”

计算鸭头都大了,你能帮帮她吗?

特别注意:n个小字符串在拼接起来的时候,不能颠倒顺序。比如,你不能把edcba拆分成ed,cb,a,然后颠倒顺序,变成de,bc,a,然后拼接为abcde

输入

第1行,1个整数,表示n。1≤𝑛≤31≤n≤3

第2行,1个字符串,只有小写英文字母。

字符串长度小于100.

输出

1行,1个字符串,表示可以得到的字典序最小的字符串

样例
输入 1
2
edcba
输出 1
aedcb
输入 2
2
yufphdhqnwkyoudpztuamlbrdudtplffoydwrnyrjxrebvrnbynqdybdajymyhomiipwtulsygwqjqpx
输出 2
ajymyhomiipwtulsygwqjqpxyufphdhqnwkyoudpztuamlbrdudtplffoydwrnyrjxrebvrnbynqdybd
输入 3
3
edcba
输出 3
abedc

代码:

作者也没有写出来。

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值