結果

問題 No.200 カードファイト!
ユーザー yaoshimaxyaoshimax
提出日時 2015-04-30 12:33:29
言語 C++11
(gcc 11.4.0)
結果
WA  
実行時間 -
コード長 3,344 bytes
コンパイル時間 858 ms
コンパイル使用メモリ 92,316 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-07-05 17:09:11
合計ジャッジ時間 1,631 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 WA -
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 1 ms
5,376 KB
testcase_04 AC 2 ms
5,376 KB
testcase_05 AC 2 ms
5,376 KB
testcase_06 AC 2 ms
5,376 KB
testcase_07 AC 2 ms
5,376 KB
testcase_08 AC 2 ms
5,376 KB
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 AC 1 ms
5,376 KB
testcase_14 AC 1 ms
5,376 KB
testcase_15 AC 1 ms
5,376 KB
testcase_16 AC 2 ms
5,376 KB
testcase_17 AC 1 ms
5,376 KB
testcase_18 AC 1 ms
5,376 KB
testcase_19 AC 2 ms
5,376 KB
testcase_20 AC 1 ms
5,376 KB
testcase_21 AC 1 ms
5,376 KB
testcase_22 AC 2 ms
5,376 KB
testcase_23 AC 1 ms
5,376 KB
testcase_24 AC 2 ms
5,376 KB
testcase_25 AC 1 ms
5,376 KB
testcase_26 AC 1 ms
5,376 KB
testcase_27 AC 1 ms
5,376 KB
testcase_28 AC 2 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <cstdio>
#include <queue>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cfloat>
#include <map>
#include <utility>
#include <set>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <sstream>
#include <complex>
#include <stack>
#include <queue>
#include <cstring>

using namespace std;

//これは何?
//最小費用流を計算するためのライブラリ。
//枝を定義する構造体edge
//枝を追加するaddedge
//最小費用流を計算するmincost関数からなる。
//なお、グラフはvector<edge> graph[]として表現される。

struct edge{ int to; int cap; int cost; int rev;};

int mincost( vector<edge> graph[], int size, int start, int end, int F ){
  bool changed = true;
  int prev[size];
  int prevind[size];
  int dist[size];
  int cost = 0;
  while( F > 0 ){
    memset( prev, -1, sizeof(prev));
    memset( prevind, -1, sizeof(prev));
    for( int i = 0 ; i < size; i++ ) dist[i] = INT_MAX/2;
    dist[start]=0;
    changed = true;
    while( changed ){
      changed = false;
      for( int  i = 0 ; i < size; i++ ){
        for( int j = 0 ; j < (int)graph[i].size(); j++ ){
          //cout << i <<"-"<< graph[i][j].to <<",";
          edge e = graph[i][j];
          if( e.cap > 0 && dist[i]+e.cost < dist[e.to] ){
            changed = true;
            dist[e.to] = dist[i]+e.cost;
            prev[e.to] = i;
            prevind[e.to] = j;
          }
        }
      }
    }
    //for( int i = 0 ; i < size; i++ ) cout << dist[i]<< " , " ;
    //cout << endl;
    if( dist[end] == INT_MAX/2){
      return -1;
    }
    // calc flaw
    int f = INT_MAX;
    int p = end;
    while( p != start ){
      f = min(f, graph[prev[p]][prevind[p]].cap );
      p = prev[p];
    }
    //cout << endl;
    f =min( F, f );
    // exec flaw
    p = end;
    while( p != start){
      graph[prev[p]][prevind[p]].cap -= f;
      int ind = graph[prev[p]][prevind[p]].rev;
      graph[p][ind].cap += f;
      cost += f*graph[prev[p]][prevind[p]].cost;
      p = prev[p];
    }
    F-=f;
  }
  return cost;
}

void addedge( vector<edge> graph[],int from, int to, int cap, int cost ){
  //枝を追加する。逆向きには容量0でコストが真逆な枝を追加しておく。
  graph[from].push_back( (edge){to,cap,cost,(int)graph[to].size()} );
  graph[to].push_back( (edge){from,0,-cost, (int)graph[from].size()-1} );
  return;
}

int main(){
   int N,A,C;
   vector<edge> graph[250];
   cin >> N;
   cin >> A;
   int B[A];
   for( int i = 0 ; i <A ;i++){
      cin >> B[i];
   }
   cin >> C;
   int D[C];
   for( int i = 0 ; i < C; i++ ){
      cin >> D[i];
   }
   sort(B,B+A);
   reverse(B,B+A);
   sort(D,D+C);
   for( int i = 0 ; i < A; i++ ){
      int timeToUse=N/A;
      if( i < N%A ) timeToUse++;
      addedge(graph,0,B[i],timeToUse,0);
   }
   for( int i = 0 ; i < C; i++ ){
      int timeToUse=N/C;
      if( i < N%C ) timeToUse++;
      addedge(graph,100+D[i],249,timeToUse,0);
   }
   for( int i = 0 ; i <A; i++ ){
      for( int j = 0 ; j < C; j++ ){
         if(B[i] <= D[j]){
            addedge(graph,B[i],100+D[j],100,1);
         }
         else{
            addedge(graph,B[i],100+D[j],100,0);
         }
      }
   }
   cout << N-mincost(graph,250,0,249,N)<<endl;
   return 0;
}
0