和为给定数

用双指针遍历,以m与arr[i] + arr[j]之间的大小关系进行对i、j的修改。
cpp
#include<bits/stdc++.h>
using namespace std;
vector<long long> arr;
int main(){
int n;
cin >> n;
for(int i = 0;i < n;i++){
long long now;
cin >> now;
arr.push_back(now);
}
sort(arr.begin(),arr.end());
long long m;
cin >> m;
int i = 0,j = n-1;
while(i < j){
if(m == arr[i] + arr[j]){cout << arr[i] << ' ' << arr[j] << endl;return 0;}
if(m < arr[i] + arr[j]) j--;
else i++;
}
// for(int i = 0;i < n;i++) cout << arr[i] << ' ';
cout << "No" << endl;
return 0;
}
最匹配的矩阵

遍历矩阵,进行对所有绝对值差的和的更新并记录此时的行号与列号,最后输出。
cpp
#include<bits/stdc++.h>
using namespace std;
const int N = 105;
int A[N][N],B[N][N];
int m,n,r,s;
int k(int a,int b){
int total = 0;
for(int i = a;i < a + r;i++){
for(int j = b;j < b + s;j++){
total += max(A[i][j],B[i - a + 1][j - b + 1]) - min(A[i][j],B[i - a + 1][j - b + 1]);
}
}
return total;
}
int main(){
cin >> m >> n;
for(int i = 1;i <= m;i++){
for(int j = 1;j <= n;j++){
cin >> A[i][j];
}
}
cin >> r >> s;
for(int i = 1;i <= r;i++){
for(int j = 1;j <= s;j++){
cin >> B[i][j];
}
}
int ans = r*s*N,ans_l = 0,ans_r = 0;
for(int line = 1;line <= m - r + 1;line++){
for(int row = 1;row <= n - s + 1;row++){
int val = k(line,row);
if(val < ans){//更新
ans = val;
ans_l = line;
ans_r = row;
}
}
}
for(int i = ans_l;i < ans_l + r;i++){
for(int j = ans_r;j < ans_r + s;j++){
cout << A[i][j] << ' ';
}
cout << endl;
}
return 0;
}