题解 | 小柒的行列改写

小柒的行列改写

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;	
}

全部评论
代码很秀
点赞 回复 分享
发布于 01-22 11:42 浙江

相关推荐

2025-12-17 12:08
门头沟学院 产品经理
牛客85811352...:1希音不知道算不算大厂 2完全符合,过得很舒服, 3确实只有杂活 领导找我续签到明年3、4月我要继续吗。主要是边实习边秋招这段时间还是有点累
什么是优秀的实习经历
点赞 评论 收藏
分享
等闲_:小红书基本不区分日常和暑期,你是应届实习时间够了就有转正机会,只要部门有hc
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务