[入门赛 #14] 魔法少女扶苏 (Hard Version) 题解
一道很好的大眼观察题。
对于每个元素
因为我们想让
最后考虑操作次数第 std::nth_element() 函数。
时间复杂度
放代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int div_ceil(int x,int y){
return x/y+!!(x%y);
} // 整数除法向上取整函数
main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n,m,k; cin>>n>>m>>k;
vector<vector<int> > a(n,vector<int>(m));
for(auto &i:a)for(auto &j:i)cin>>j;
vector<int> r(n),c(m),d;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
r[i]+=a[i][j],c[j]+=a[i][j];
// 预处理 r,c 数组
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
d.emplace_back(div_ceil(r[i]+c[j]-a[i][j],n+m-1));
// 将所有操作数放进一个 std::vector
nth_element(d.begin(),d.begin()+k-1,d.end());
cout<<d[k-1]<<endl;
// 找出 k 小数并输出
return 0;
}