結果
| 問題 | No.200 カードファイト! |
| コンテスト | |
| ユーザー |
btk
|
| 提出日時 | 2015-04-29 02:57:17 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 4 ms / 2,000 ms |
| コード長 | 1,941 bytes |
| コンパイル時間 | 725 ms |
| コンパイル使用メモリ | 90,740 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-10-15 08:59:22 |
| 合計ジャッジ時間 | 1,562 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 26 |
ソースコード
#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<list>
#include<algorithm>
#include<utility>
#include<complex>
#include<functional>
using namespace std;
typedef pair<int, int> P;
int N;
P adj[102][102];
const int INF=(int)1e5;
int mincostflow(int s,int t,int f){
int res = 0;
while (f > 0){
// cout << f << endl;
vector<int> dist(102, INF);
vector<int> par(102, s);
dist[s] = 0;
bool update = true;
while (update){
update = false;
for (int v = 0; v < 102; v++){
if (dist[v] == INF)continue;
for (int i = 0; i < 102; i++){
if (adj[v][i].second > 0 && dist[i] > dist[v] + adj[v][i].first){
dist[i] = dist[v] + adj[v][i].first;
par[i] = v;
update = true;
}
}
}
}
res += dist[t];
for (int v = t; v != s; v = par[v]){
// printf(">%d", par[v]);
adj[par[v]][v].second--;
adj[v][par[v]].second++;
}
// cout << endl;
f--;
}
return res;
}
int main(void){
int A, C;
int B[50], D[50];
cin >> N >> A;
for (int i = 0; i < A; i++){
cin >> B[i];
}
cin >> 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 < N; i++){
B[i] = B[i%A];
D[i] = D[i%C];
}
for (int i = 0; i < N; i += A){
int s = i;
int e = min(s + A - 1, N - 1);
int tos = (s/C)*C;
int toe = min(((e / C )*C +C-1), N - 1);
for (int j = s; j <= e; j++){
for (int k = tos; k <= toe; k++){
//cout << j << k << endl;
adj[j][k + 50].first = (B[j] <= D[k]);
adj[k + 50][j].first = -adj[j][k + 50].first;
adj[k+50][j].second = 0;
adj[j][k + 50].second = 1;
}
}
}
for (int i = 0; i < 50; i++){
adj[100][i].second= 1;
adj[i+50][101].second =1;
}
cout << N - mincostflow(100, 101, N) << endl;;
return(0);
}
btk