第一题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; }
全部评论
(6) 回帖