今日学习记录
1. Problem-1914D-cf
关键词:模拟
问题分析:
给出三行数据,要求选出三个数,不同行不同列相加为最大的三个数
核心思路: 三个数要不同行不同列,且最大,肯定是找到三行数据中每行最大的三个,由于有两个不同,则要进行选择,既要排除行也要排除列,我们先对每行数组进行排序,对数组下标按照值的大小排序,这样每行共用下标,记录下标,进行暴力搜索所有可能,就前 3X3 的数组,时间消耗很小 **最终代码:
#include <bits/stdc++.h>
using namespace std;
#define ve vector
using ll = long long;
using ull = unsigned long long;
using sr = string;
using db = double;
int T,n;
ve<int> get_mx(ve<int> ar){
int mx1 = -1,mx2 = -1,mx3 = -1;
for(int i = 0;i<n;i++){
if(mx1==-1||ar[i]>ar[mx1]){
mx3 = mx2;
mx2 = mx1;
mx1 = i;
}else if(mx2 == -1||ar[i]>ar[mx2]){
mx3 = mx2;
mx2 = i;
}else if(mx3==-1||ar[i]>ar[mx3]) mx3 = i;
}
return {mx1,mx2,mx3};
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin>>T;
while(T--){
cin>>n;
ve<ve<int>> arr,nums;
int ans = 0;
for(int k = 0;k<3;k++){
ve<int> ar(n);
for(int i = 0;i<n;i++){
cin>>ar[i];
}
nums.push_back(ar);
arr.push_back(get_mx(ar));
}
for(int i:arr[0]){
for(int j:arr[1]){
for(int k:arr[2]){
if(i!=j&&i!=k&&j!=k) ans = max(ans,nums[0][i]+nums[1][j]+nums[2][k]);
}
}
}
cout<<ans<<endl;
}
return 0;
}学到的点:
- 思维不行