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
代码:
作者也没有写出来。