拼多多笔试 小菜鸟一枚 求大佬解答
第一题ac
#include <iostream>
#include <vector>
using namespace std;
int main() {
int target, n; //当前距离,投掷次数
cin >> target >> n;
if(target==0){
cout << "paradox" << endl;
return 0;
}
vector<int> vec;
int dist = target; //距离终点的距离
int d;//投出点数为d的骰子
int backcount = 0; //回退次数
for(int i=0; i<n; i++){
cin >> d;
if( d == dist && i<n-1){
cout << "paradox" << endl; //如果成功到达终点
return 0;
}else if( d > dist ){ //超出了就要回退
dist = d - dist;
backcount++;
}else{
dist = dist - d;
}
}
//如果没有成功到达,要输出最终距离,以及回退次数
cout << dist << " " << backcount << endl;
return 0;
} 第二题不会。判断等价骰子的情况
第三题暴力解只通过50%,超时
#include <iostream>
#include <vector>
using namespace std;
int main() {
int minenergy = 100001;
bool flag = false;
int n, m, tasteTarget; //中餐数量,晚餐数量,最低美味要求
cin >> n >> m >> tasteTarget;
//最低美味值为0,那就一顿都不吃
if( tasteTarget==0 ){
cout << 0 << endl;
return 0;
}
//中餐的热量和美味
vector<int> energyA;
vector<int> tasteA;
int energy, taste;
for(int i=0; i<n; i++){
cin >> energy >> taste;
//单吃午餐就达到美味要求了
if( taste >= tasteTarget ){
flag = true;
//更新最低热量
if(energy<minenergy)
minenergy = energy;
}else if( taste>0){//否则就记录,用作后续跟晚饭一起(注意美味值为0就不记录了)
energyA.push_back(energy);
tasteA.push_back(taste);
}
}
//晚餐的热量和美味
vector<int> energyB;
vector<int> tasteB;
for(int i=0; i<m; i++){
cin >> energy >> taste;
//单吃wan餐就达到美味要求了
if( taste >= tasteTarget ){
flag = true;
//更新最低热量
if(energy<minenergy)
minenergy = energy;
}else if( taste>0 ){//否则就记录,用作后续跟中餐一起(注意美味值为0就不记录了)
energyB.push_back(energy);
tasteB.push_back(taste);
}
}
//每餐可吃可不吃,但最多吃一种套餐。在最低美味要求tasteTarget之下,最少的热量值(输出结果)
//两餐都吃
int sizea = energyA.size();
int sizeb = energyB.size();
for(int i=0; i<sizea; i++){
for(int j=0; j<sizeb; j++){
energy = energyA[i] + energyB[j];
taste = tasteA[i] + tasteB[j];
if( taste >= tasteTarget ){
flag = true;
//更新最低热量
if(energy<minenergy)
minenergy = energy;
}
}
}
if(flag){
cout << minenergy<< endl;
}else{
cout << -1 << endl;
}
return 0;
}
查看1道真题和解析