NC20617. 冥土追魂
描述
输入描述
第一行三个数 n, m, k。
接下来 n 行,每行 m 个数,第 i 行第 j 个数表示棋盘第 i 行第 j 列上的呱太数量 ai,j。
输出描述
输出共一个数,表示在你的预测下,Misaka最终能拿走呱太的数量。
示例1
输入:
3 2 4 5 7 3 2 8 5
输出:
17
C++14(g++5.4) 解法, 执行用时: 380ms, 内存消耗: 16384K, 提交时间: 2018-10-12 20:34:11
#include<bits/stdc++.h> using namespace std; #define ll long long ll a[1005][1005]; ll b[1005],c[1005]; int main(){ int n,m,k; scanf("%d%d%d",&n,&m,&k); int z=k/m; int d=k%m; ll o=0; priority_queue<ll> q1[1005]; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ scanf("%lld",&a[i][j]); b[i]+=a[i][j]; o+=a[i][j]; q1[i].push(a[i][j]); } } for(int i=0;i<n;i++){ for(int j=0;j<d;j++){ c[i]+=q1[i].top(); q1[i].pop(); } } ll ans=1e18; for(int i=0;i<n;i++){ ll s=0; s+=c[i]; priority_queue<ll,vector<ll>,greater<ll> > q; for(int j=0;j<n;j++){ if(i==j) continue; q.push(b[j]); } for(int j=0;j<z;j++){ if(q.size()==0) break; s+=q.top(); q.pop(); } ans=min(ans,s); } if(k==n*m) printf("%lld\n",o); else printf("%lld\n",ans); }
C++11(clang++ 3.9) 解法, 执行用时: 811ms, 内存消耗: 8416K, 提交时间: 2018-10-12 19:16:36
#include<bits/stdc++.h> #define ll long long using namespace std; int m,n,a[1010],k; ll s[1010],q[1010],b[1010][1010],ansn=1e18; int main(){ cin>>n>>m>>k; for (int i=1;i<=n;i++){ for (int j=1;j<=m;j++)cin>>a[j]; sort(a+1,a+m+1); for (int j=1;j<=m;j++) b[i][j]=b[i][j-1]+a[m-j+1]; s[i]=b[i][m]; } sort(s+1,s+n+1); for (int i=1;i<=n;i++) q[i]=q[i-1]+s[i]; int x,y; if (k%m==0)x=k/m-1;else x=k/m; y=k-x*m; for (int i=1;i<=n;i++){ if (b[i][m]<=s[x]){ ansn=min(ansn,q[x+1]-b[i][m]+b[i][y]); }else{ ansn=min(ansn,b[i][y]+q[x]); } } cout<<ansn<<endl; return 0; }