题解:P15051 [UOI 2023 II Stage] Nova Poshta

· · 题解

P15051题解

题意简述

本来就是模拟,题目里说的很清楚了(绝对不是因为我懒得复述)。

解题思路

照题意模拟即可,先判断他们两个各自是否能完成订单,如果不能单独完成,再递归判断两个人是否能合作完成,如果都不行就输出 They can not do it!

还是不明白?看代码。

代码实现

#include<bits/stdc++.h>
#define int long long
using namespace std;
int m[5],m1,m2,summ,a1[5],a2[5],tp1,tp2;
bool pd(int mm){return mm>=summ;}
void dfs(int x,int mt1,int mt2){//深搜判断是否能共同完成,x是当前货物编号,mt1和mt2分别是两辆货车的剩余容量
    if(x>4){//递归边界,货物放完了就是可以共同完成
        printf("They need to work together!\n");
        printf("Vasyl:");
        for(int i=1;i<=tp1;i++) printf(" %lld",a1[i]);
        printf("\nPetro:");
        for(int i=1;i<=tp2;i++) printf(" %lld",a2[i]);//输出
        exit(0) ;//exit(0)可以在函数中终止程序
    }
    if(mt1>=m[x]){
        a1[++tp1]=x+1;
        dfs(x+1,mt1-m[x],mt2);
        tp1--;
    }
    if(mt2>=m[x]){
        a2[++tp2]=x+1;
        dfs(x+1,mt1,mt2-m[x]);
        tp2--;
    }
}
signed main(){
    for(int i=0;i<5;i++){
        scanf("%lld",&m[i]);
        summ+=m[i];//计算货物重量和
    }
    scanf("%lld %lld",&m1,&m2);//读入
    bool f1=pd(m1),f2=pd(m2);//判断他们各自是否能完成订单
    if(f1&&f2) printf("They both can do it!");//都可以完成!
    else if(f1) printf("Vasyl can do it!");
    else if(f2) printf("Petro can do it!");//其中一个可以单独完成
    else if(!f1&&!f2){//需要合作或不能完成
        dfs(0,m1,m2);
        printf("They can not do it!");
    }
    return (0^0);//卖个萌
}