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;
}

猜你喜欢

转载自blog.csdn.net/Dilly__dally/article/details/83083418
今日推荐