#题解Codeforces Round 1003 (Div. 4)_D. Skibidus and Sigma
中文题面如图

思路
用一个结构体来存 第几个数组即为i,然后是和其数组sum,贪心地,要让得分最高 ,我肯定这几个数组里面sum越大的越早出现越好 类似于构造,把最大的放最前面就可以了 后面连接最小的,然后就是自定义一个按sum大小降序排序的sort,按照这个排序,关于怎么计算总得分,我结构体第一个变量就是存第几个出现的,我输入数据肯定要一个二维数组存初始数据,为根据结构体第一个变量知道行,然后再套一个0-m的for循环不久可以加了,注意我这个是算贡献的,你看样例

对于样例一,4第一个出现,一共加了n * m次,即对最终得分贡献了4 * n * m分,按照这个算就可以了,后面依次出现的就依次减一
\(AC_code\)
void solve() {
int n,m ;
cin >> n >> m ;
vector<vector<int>>a(n,vector<int>(m,0)) ;
vector<Node>cp(n) ;
for(int i = 0;i < n;i++){
int all = 0 ;
for(int j = 0;j < m;j++){
cin >> a[i][j] ;
all += a[i][j] ;
}
cp[i] = {i,all} ;
}
sort(cp.begin(),cp.end(),[](const Node &x,const Node &y){
return x.sum > y.sum ;
}) ;
int all_e = n * m ;
int ans = 0 ;
for(int j = 0;j < n;j++){
int begin_indx = cp[j].i ;
for(int k = 0;k < m;k++){
ans += a[begin_indx][k] * all_e ;
all_e-- ;
}
}
cout << ans << "\n" ;
}

浙公网安备 33010602011771号