题解 | 小柒的行列改写
小柒的行列改写
https://www.nowcoder.com/practice/3a21b1bdc3ba45c48e806d242301f6c1
拉了一大坨的代码,然后一遍过,简直快哉快哉啊齁齁齁齁
因为每个行与列只会输入一次,对于图中[i][j]点只有两种情况:r[i]的值 或 c[j]的值
所以先输入全部的ri,ci,用结构体存储其三项信息:1.值 2.行或列的状态 3.对应的下标
sort排序,值大的排前面,先填充
建立变量 rnum和cnum表示行和列中已经被填的数量,再建立sum存储答案
for循环,对于第一项,假设是行,因为cnum初始为0,所以sum+=vec[i].num*(n-0)
后续从大往小填按行与列填,每次填入的都是vec[i].num(该项的值)*该行或列中还未填的位置的数量
填完后进行rnum++或cnum++表示该行或列已经填的数量加一
最后输出答案就好拉,觉得写的好的点个赞吧awa
#include <bits/stdc++.h>
using namespace std;
typedef struct{
int num;//值
bool judge;//0为row 1为col
int sit;//下标位置
}arr;
//sort函数,按值逆序
bool cmp(const arr &a,const arr &b){
return a.num>b.num;
}
int n,m;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
//按题意输入
cin>>n>>m;
vector<arr>vec(n+m);
for(int i=0;i<n;i++){
int x;
cin>>x;
vec[i].num=x;
vec[i].judge=0;
vec[i].sit=i;
}
for(int i=0;i<m;i++){
int x;
cin>>x;
vec[n+i].num=x;
vec[n+i].judge=1;
vec[n+i].sit=i;
}
sort(vec.begin(),vec.end(),cmp);
//初始为0
int rnum=0;
int cnum=0;
long long sum=0;
for(int i=0;i<n+m;i++){
if(vec[i].judge==0){
sum+=vec[i].num*(m-cnum);
rnum++;
}
else{
sum+=vec[i].num*(n-rnum);
cnum++;
}
}
cout<<sum;
return 0;
}

