Wannafly挑戰賽26
阿新 • • 發佈:2018-10-13
code push_back ret gin 很多 .... 希望 所有 typedef
首先明確一行要取肯定都取,然後根據k|m分成兩種情況討論就行。
三.代碼
一.題目
有一天 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