Avatar
“”

一个兴趣使然的追梦人

▼

#题解Codeforces Round 1003 (Div. 4)_D. Skibidus and Sigma

D. Skibidus and Sigma,传送门<-点我

中文题面如图

image

思路

用一个结构体来存 第几个数组即为i,然后是和其数组sum,贪心地,要让得分最高 ,我肯定这几个数组里面sum越大的越早出现越好 类似于构造,把最大的放最前面就可以了 后面连接最小的,然后就是自定义一个按sum大小降序排序的sort,按照这个排序,关于怎么计算总得分,我结构体第一个变量就是存第几个出现的,我输入数据肯定要一个二维数组存初始数据,为根据结构体第一个变量知道行,然后再套一个0-m的for循环不久可以加了,注意我这个是算贡献的,你看样例
image
对于样例一,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" ;
}
posted @ 2026-09-28 14:52  hermanO  阅读(6)  评论(0)    收藏  举报