标签:mis 选择 最优 思路 names += clu const ret
一.题目
有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏....
Misaka和Kuroko在一个 n x m 的棋盘上玩游戏,每个格子上都放着一些呱太。游戏共进行 k 回合,每一回合 Kuroko会选有呱太的一行 i,在这之后Misaka会选择一列 j ,并拿走格子 (i, j) 上的所有呱太,Misaka希望自己拿走的呱太尽可能多,而Kuroko不想让Misaka拿走很多呱太,所以她希望拿走的呱太尽可能少。
在一旁围观的恒温死神希望预测结果,请你预测在双方都采取最优策略的情况下,Misaka最终能拿走呱太的数量。
1≤ n, m ≤ 1000, 1 ≤ k ≤ n x m, 1 ≤ ai,j ≤ 109
二.思路
首先明确一行要取肯定都取,然后根据k|m分成两种情况讨论就行。
三.代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,m,k,t;
ll a[1001][1001];
vector<ll> v;
bool cmp(ll x,ll y){
return x>y;
}
int main(){
while(~scanf("%d%d%d",&n,&m,&k)){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) scanf("%lld",&a[i][j]);
sort(a[i]+1,a[i]+m+1,cmp);
for(int j=1;j<=m;j++) a[i][j]+=a[i][j-1];
}
ll ans=1e18;
if(k%m==0){
ans=0;
for(int i=1;i<=n;i++) v.push_back(a[i][m]);
sort(v.begin(),v.end());
for(int i=0;i<k/m;i++) ans+=v[i];
}
else {
for(int i=1;i<=n;i++){
v.clear();
ll t=a[i][k%m];
for(int j=1;j<=n;j++){
if(i==j) continue;
v.push_back(a[j][m]);
}
sort(v.begin(),v.end());
for(int i=0;i<k/m;i++) t+=v[i];
if(t<ans) ans=t;
}
}
printf("%lld\n",ans);
}
return 0;
}
标签:mis 选择 最优 思路 names += clu const ret
原文地址:https://www.cnblogs.com/Advancingxq/p/9781232.html