1. 程式人生 > >Wannafly挑戰賽26

Wannafly挑戰賽26

code push_back ret gin 很多 .... 希望 所有 typedef

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

Wannafly挑戰賽26