1. 程式人生 > >Wannafly挑戰賽26 B 冥土追魂(暴力)

Wannafly挑戰賽26 B 冥土追魂(暴力)

題意:連結:https://www.nowcoder.com/acm/contest/212/B
來源:牛客網

有一天 Misaka 和 Kuroko 在玩一個關於冥土追魂的遊戲....
Misaka和Kuroko在一個 n x m 的棋盤上玩遊戲,每個格子上都放著一些呱太。遊戲共進行 k 回合,每一回合 Kuroko會選**有呱太**的一行 i,在這之後Misaka會選擇一列 j ,並拿走格子 (i, j) 上的所有呱太,Misaka希望自己拿走的呱太儘可能多,而Kuroko不想讓Misaka拿走很多呱太,所以她希望拿走的呱太儘可能少。
在一旁圍觀的恆溫死神希望預測結果,請你預測在雙方都採取最優策略的情況下,Misaka最終能拿走呱太的數量。

思路:先把每一行分別按從大到小排,預處理字首和,如果k%m==0,那麼取前k/m個每行的和;如果k%m!=0,那麼暴力列舉每一行(多出來的k%m個數),然後在除了這一行的其他行找到最小的前k/m行和。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=1005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}
ll qpow(ll a,ll b)
{
    ll t=1;
    while(b)
    {
        if(b%2)
        {
            t=(t*a)%mod;
            b--;
        }
        a=(a*a)%mod;
        b/=2;
    }
    return t;
}
bool cmp(ll a,ll b)
{
    return a>b;
}
ll a[maxn][maxn];
int main()
{
    std::ios::sync_with_stdio(false);
    int n,m,k;
    while(cin>>n>>m>>k)
    {
        vector<ll> v1,v2;
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                cin>>a[i][j];
            }
            sort(a[i],a[i]+m,cmp);
            for(int j=1; j<m; j++)
            {
                a[i][j]+=a[i][j-1];
            }
            v1.push_back(a[i][m-1]);
        }
        sort(v1.begin(),v1.end());
        ll ans=0;
        if(k%m==0)
            for(int i=0; i<k/m; i++)
            {
                ans+=v1[i];
            }
        else
        {
            ans=1e18;
            for(int i=0; i<n; i++)
            {
                v2.clear();
                ll t=a[i][k%m-1];
                for(int j=0; j<n; j++)
                {
                    if(i!=j)
                    {
                        v2.push_back(a[j][m-1]);
                    }
                }
                sort(v2.begin(),v2.end());
                for(int j=0; j<k/m; j++)
                {
                    t+=v2[j];
                }
                ans=min(ans,t);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}