Wannafly挑战赛26

一.题目
有一天 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;
}

猜你喜欢

转载自www.cnblogs.com/Advancingxq/p/9781232.html