Wannafly挑戰賽26 B 冥土追魂(暴力)
阿新 • • 發佈:2018-11-08
題意:連結: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; }