제출 #567265

#제출 시각아이디문제언어결과실행 시간메모리
567265katwamiawKitchen (BOI19_kitchen)C++14
31 / 100
3 ms212 KiB
#include<bits/stdc++.h>
#define ll long long
#define no cout << "NO\n"
#define yes cout << "YES\n"
#define endl '\n'
#define pb push_back
using namespace std ;
//fflush(stdout) ;

const int Max_n=305 ;
int a[Max_n] , b[Max_n] ;
int dp[Max_n*Max_n] ;
int n , m , k ;
int sum_a=0 , sum_b=0 ;

int work(){
    int ans=-1 ;
    sort(b,b+m) ;
    for(int i=1 ; i<(1<<m) ; i++){
        int r=0 , sum=0 ;
        for(int j=0 ; j<m ; j++){
            if(i&(1<<j)){
                r++ ;
                sum+=b[j] ;
            }
        }
        if(r<k||sum<sum_a) continue ;
        int re=0 , pu=0 , h=0 , x=0 ;
        for(int j=m ; j>=0 ; j--){
            if(h==k){
                x=1 ;
                break ;
            }
            if(!(i&(1<<j))) continue ;
            if(b[j]>=(n-re)){
                h++ ;
                if(re>0){
                    re=(b[j]+re)-n ;
                }
                else re=0 ;
            }
            else{
                re+=b[j] ;
            }
        }
        if(h==k||x==1){
            if(ans==-1) ans=sum-sum_a ;
            ans=min(ans,sum-sum_a) ;
        }
    }
    return ans ;
}

int main(){
    cin >> n >> m >> k ;

    for(int i=0 ; i<n ; i++) cin >> a[i] ;
    for(int i=0 ; i<m ; i++) cin >> b[i] ;

    for(int i=0 ; i<n ; i++) sum_a+=a[i] ;
    for(int i=0 ; i<m ; i++) sum_b+=b[i] ;

    for(int i=0 ; i<n ; i++){
        if(a[i]<k){
            cout << "Impossible" ;
            return 0 ;
        }
    }

    if(sum_a>sum_b){
        cout << "Impossible" ;
        return 0 ;
    }

    if(k>m){
        cout << "Impossible" ;
        return 0 ;
    }

    if(m<=2){
        if(k==m){

            for(int i=0 ; i<m ; i++){
                if(b[i]<n){
                    cout << "Impossible" ;
                    return 0 ;
                }
            }
            cout << sum_b-sum_a ;
        }
        else{
            int ans=400 ;
            if(b[0]>=sum_a) ans=b[0]-sum_a ;
            if(b[1]>=sum_a) ans=min(b[1]-sum_a,ans) ;

            if(ans==400){
                if(sum_a>sum_b){
                    cout << "Impossible" ;
                    return 0 ;
                }
                cout << sum_b-sum_a ;
            }
            else cout << ans ;
        }
        return 0 ;
    }
    int ans=work() ;
    if(ans==-1) cout << "Impossible" ;
    else cout << ans ;
}

컴파일 시 표준 에러 (stderr) 메시지

kitchen.cpp: In function 'int work()':
kitchen.cpp:28:20: warning: unused variable 'pu' [-Wunused-variable]
   28 |         int re=0 , pu=0 , h=0 , x=0 ;
      |                    ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...