1. 图像叠加

在图像应用程序中经常要将2个图层进行叠加,从而产生各种瑰丽的合成效果。现在请你实现常见的线性光叠加模式。

线性光叠加模式公式:C = A + 2B - 255;C < 0 时,取 C = 0;C > 255 时,取 C = 255。

在公式中 A 代表下面图层的颜色值,也称为基色;B 代表上面图层的颜色值,也成为混合色;C 代表混合图层的颜色值,也称为结果色。

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

输入描述:
第一行输入2个数字 M N,表示输入图片的大小(M、N 小于 1024)。
之后输入 M 行数据为 A 图像的数据内容,每行 N 个数字,表示该行的像素值。
之后继续输入 M 行数据为 B 图像的数据内容,每行 N 个数字,表示该行的像素值。

输出描述:
M 行数据,每行 N 个数字,表示结果图片像素值。

示例1
输入例子:

2 2 100 200 50 50 50 50 100 100

输出例子:

0 45 0 0

示例2
输入例子:

2 3 23 172 238 238 174 151 22 117 230 230 237 141

输出例子:

0 151 255 255 255 178

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <vector>
using namespace std;

int M, N;
int a[1024][1024];
int b[1024][1024];
int res[1024][1024];

int main() {
cin >> M >> N;
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
cin >> a[i][j];
}
}

for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
cin >> b[i][j];
res[i][j] = a[i][j] + 2 * b[i][j] - 255;
if (res[i][j] < 0) res[i][j] = 0;
if (res[i][j] > 255) res[i][j] = 255;
}
}

for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
cout << res[i][j] << " ";
}
cout << endl;
}
}
  1. 直角三角形的个数

二维平面直角坐标系中有 N 个整型坐标点 (x1, y1), (x2, y2), …, (xN, yN),任意三个点都可能构成一个三角形,计算这些三角形中直角三角形的个数。

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M

输入描述:
输入有两行:
第一行为 N,3 ≤ N ≤ 256。
第二行为输入 N 个双字节整型坐标点,共 2N 个数据,以空格分隔横纵坐标及不同的点,x1 y1 x2 y2 … xn yn… xN yN。

输出描述:
输出直角三角形个数。

示例1
输入例子:

20
0 0 0 3 1 2 3 4 5 6 7 8 1 4 2 4 3 5 5 0 5 5 2 0 2 2 3 0 3 3 4 5 6 1 3 7 4 0 5 2

输出例子:

165

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;

int N, cnt = 0;
int x[256];
int y[256];

int distSquared(int i, int j) {
return (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]);
}

int main() {
cin >> N;

for (int i = 0; i < N; i++) {
cin >> x[i] >> y[i];
}

for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
for (int k = j + 1; k < N; k++) {
int a2 = distSquared(i, j);
int b2 = distSquared(j, k);
int c2 = distSquared(k, i);

// Check if it forms a right triangle
if (a2 + b2 == c2 || a2 + c2 == b2 || b2 + c2 == a2) {
cnt++;
}
}
}
}
cout << cnt;
return 0;
}