結果
| 問題 |
No.177 制作進行の宮森あおいです!
|
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2018-07-11 01:51:42 |
| 言語 | C90 (gcc 12.3.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 2,000 ms |
| コード長 | 1,770 bytes |
| コンパイル時間 | 403 ms |
| コンパイル使用メモリ | 24,832 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-09-14 07:17:59 |
| 合計ジャッジ時間 | 1,112 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 13 |
コンパイルメッセージ
main.c: In function ‘run’:
main.c:56:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
56 | scanf("%d",&w);
| ^~~~~~~~~~~~~~
main.c:58:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
58 | scanf("%d",&n);
| ^~~~~~~~~~~~~~
main.c:61:20: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
61 | for(i=0;i<n;i++) scanf("%d",genga+i);
| ^~~~~~~~~~~~~~~~~~~
main.c:63:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
63 | scanf("%d",&m);
| ^~~~~~~~~~~~~~
main.c:65:20: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
65 | for(i=0;i<m;i++) scanf("%d",sakuga+i);
| ^~~~~~~~~~~~~~~~~~~~
main.c:82:5: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
82 | scanf("%d",&q);
| ^~~~~~~~~~~~~~
main.c:85:7: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
85 | scanf("%d",&x);
| ^~~~~~~~~~~~~~
ソースコード
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef long long int int64;
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
#define ABS(a) ((a)>(0)?(a):-(a))
#define POS(i,j) ((i)*(n+m+2)+(j))
int flow(int *g,int n,int m){
int used[102];
int dp[102];
int i;
for(i=0;i<n+m+2;i++){
used[i]=0;
dp[i]=0;
}
dp[0]=10000;
int memo[102];
int len=0;
while(1){
int max=0;
int maxIndex=-1;
for(i=0;i<n+m+2;i++){
if(!used[i] && dp[i]>max){
max=dp[i];
maxIndex=i;
}
}
if(max==0) break;
used[maxIndex]=1;
memo[len++]=maxIndex;
for(i=0;i<n+m+2;i++){
dp[i]=MAX(dp[i],MIN(dp[maxIndex],g[POS(maxIndex,i)]));
}
}
if(dp[n+m+1]==0) return 0;
int now=n+m+1;
int f=dp[now];
for(i=len-1;now!=0;i--){
int k=memo[i];
if(dp[k]>=f && g[POS(k,now)]>=f){
g[POS(k,now)]-=f;
g[POS(now,k)]+=f;
now=k;
}
}
return f;
}
void run(void){
int w;
scanf("%d",&w);
int n;
scanf("%d",&n);
int genga[50];
int i;
for(i=0;i<n;i++) scanf("%d",genga+i);
int m;
scanf("%d",&m);
int sakuga[50];
for(i=0;i<m;i++) scanf("%d",sakuga+i);
int graph[10404];
int j;
for(i=0;i<n+m+2;i++){
for(j=0;j<n+m+2;j++){
graph[POS(i,j)]=0;
}
}
for(i=0;i<n;i++) graph[POS(0,i+1)]=genga[i];
for(i=0;i<n;i++){
for(j=0;j<m;j++){
graph[POS(i+1,n+1+j)]=10000;
}
}
for(i=0;i<m;i++) graph[POS(n+1+i,n+m+1)]=sakuga[i];
for(i=0;i<m;i++){
int q;
scanf("%d",&q);
while(q--){
int x;
scanf("%d",&x);
graph[POS(x,n+1+i)]=0;
}
}
int f=0;
while(w>0 && (f=flow(graph,n,m),f>0)) w-=f;
printf("%s\n",w<=0?"SHIROBAKO":"BANSAKUTSUKITA");
return;
}
int main(void){
run();
return 0;
}
akakimidori