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
#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;
}
}
3.
直角三角形的个数
二维平面直角坐标系中有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
#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;
}
第二道题编译运行时间有问题,求助大佬解决
2.
世界杯积分问题
2022年卡塔尔世界杯是第一次在年底举行的世界杯,当然中国男足早早出局,为了让更多球队有机会参这项举世瞩目的盛会,传言2026年世界杯每个小组将有5支球队参加,进行单循环比赛, 每个小组总场数共打10场,每场比赛胜者得3分,负者得0分,如果踢平两队各得1分。求小组赛结束后,最终得分由高到低排列,去重之后会有多少种可能的情况,并对输入的得分组合判断其是否是一种可能的得分结果。比如一种可能得分是6 5 5 5 4,这时候不考虑是哪一支队伍排第一,只看最终得分的可能组合。
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
输入描述:
第一行,1个是int类型的值,判断这个值是不是小组赛排名后的得分去重后所有可能的组合的数目? 第二行,输入5个是降序排列的int类型的数,判断这组值是不是可能的【小组赛排名后的得分】组合情况之一?
输出描述:
输出一行:对于两个判断,分别输出yes,或者no,用空格隔开,比如no yes
示例1
输入例子:
328 6 5 5 5 4
输出例子:
no yes
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
set<vector<int>> all_scores;
void generateCombinations(int match_count, vector<int>& scores) {
if (match_count == 10) {
sort(scores.rbegin(), scores.rend());
all_scores.insert(scores);
return;
}
for (int i = 0; i < 5; i++) {
for (int j = i + 1; j < 5; j++) {
vector<int> new_scores = scores;
// i胜,j负
new_scores[i] += 3;
generateCombinations(match_count + 1, new_scores);
// i平,j平
new_scores = scores;
new_scores[i] += 1;
new_scores[j] += 1;
generateCombinations(match_count + 1, new_scores);
}
}
}
int main() {
int expected_combinations;
cin >> expected_combinations;
vector<int> n(5);
for (int i = 0; i < 5; i++) {
cin >> n[i];
}
vector<int> scores(5, 0);
generateCombinations(0, scores); // 调用函数生成所有得分组合
int actual_combinations = all_scores.size(); // 获取生成的组合数量
// 输出第一个判断
if (expected_combinations == actual_combinations) {
cout << "yes ";
} else {
cout << "no ";
}
// 对输入的组合进行降序排序
sort(n.rbegin(), n.rend());
// 输出第二个判断
if (all_scores.count(n)) {
cout << "yes";
} else {
cout << "no";
}
cout << endl;
return 0;
}