题解: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);//卖个萌
}