1.飞行棋,输入K(距离),N(掷骰子的次数),问最后飞行棋到终点的距离是多少?,需要返回多少次?(因为飞行棋如果超出终点的话会返回的)如果为0的话输出“paradox”。
思路很简单,用初始距离挨个减去给的距离,如果是正数,continue;如果是0,break,输出paradox;如果是负数,回退次数加1,然后将距离取反。(好像只过了96%, 知道原因的大佬麻烦给解答一下。有大佬解答了,是因为当最后一步到达终点时,应该输出0而不是paradox)
输入:
10 2
6 3
输出:
1 0
因为6+3=9,10-9=1,还剩1步,且没有后退。
#include<iostream> #include<vector> using namespace std; int main() { int len, step; cin >> len >> step; if (len == 0) { cout << "paradox" << endl; return 0; } vector<int> arr(step, 0); for (int i = 0; i < arr.size(); i++) cin >> arr[i]; bool flag = false; int res = len; int back_step = 0; for (int i = 0; i < arr.size(); i++) { len -= arr[i]; if (len < 0) { back_step++; len = -len; } else if (len == 0) { flag = true; break; } else continue; } if (flag) cout << "paradox" << endl; else cout << len << " " << back_step << endl; return 0; }
2、两个骰子如果同类,则通过上下,左右,前后反转,它们都相同,求不同种类的骰子的数量各是多少?
输入:
2
1 2 3 4 5 6
1 2 6 5 3 4
输出
1
2
思路:直接暴力,选定一个值,比如1,在给定骰子中找出1的位置,同时求出1上下左右的值,保存,然后取后面的骰子,也找出1的位置,求出1上下左右的值。然后对比两个骰子1的上下左右位置是否对应相等,旋转后相等也算相等。
然后用一个数组记录已经被搜寻过的骰子,下次直接跳过。
代码:
#include<iostream> #include<vector> #include<algorithm> using namespace std; void aroundNum(vector<int> arr, vector<int> &res, int pos) { if (pos == 0) { res[0] = arr[5]; res[1] = arr[4]; res[2] = arr[2]; res[3] = arr[3]; } else if (pos == 1) { res[0] = arr[4]; res[1] = arr[5]; res[2] = arr[2]; res[3] = arr[3]; } else if (pos == 2) { res[0] = arr[0]; res[1] = arr[1]; res[2] = arr[5]; res[3] = arr[4]; } else if (pos == 3) { res[0] = arr[0]; res[1] = arr[1]; res[2] = arr[4]; res[3] = arr[5]; } else if (pos == 4) { res[0] = arr[0]; res[1] = arr[1]; res[2] = arr[2]; res[3] = arr[3]; } else if (pos == 5) { res[0] = arr[0]; res[1] = arr[1]; res[2] = arr[3]; res[3] = arr[2]; } } bool isSame(vector<int> arr1, vector<int> arr2) { int pos1, pos2; vector<int> index1(4, 0); vector<int> index2(4, 0); for (int i = 0; i < 6; i++) if (arr1[i] == 1) pos1 = i; aroundNum(arr1, index1, pos1); for (int i = 0; i < 6; i++) if (arr2[i] == 1) pos2 = i; aroundNum(arr2, index2, pos2); if ((index1[0] == index2[0] && index1[1] == index2[1] && index1[2] == index2[2] && index1[3] == index2[3]) || (index1[0] == index2[3] && index1[1] == index2[2] && index1[2] == index2[0] && index1[3] == index2[1]) || (index1[0] == index2[1] && index1[1] == index2[0] && index1[2] == index2[3] && index1[3] == index2[2]) || (index1[0] == index2[2] && index1[1] == index2[3] && index1[2] == index2[1] && index1[3] == index2[0])) return true; else return false; } int main() { int num; cin >> num; vector<vector<int>> arr(num, vector<int>(6, 0)); //读取数据 for (int i = 0; i < num; i++) for (int j = 0; j < 6; j++) cin >> arr[i][j]; vector<int> used(num, 0); vector<int> res; for (int i = 0; i < arr.size(); i++) { int times = 1; if (!used[i]) { for (int j = 0; j < arr.size(); j++) { if (i != j && isSame(arr[i], arr[j]) && used[j] == 0) { used[j] = 1; times++; } } res.push_back(times); } } cout << res.size() << endl; sort(res.begin(), res.end()); for (int i = res.size() - 1; i >= 0; i--) cout << res[i] << " "; //cout << endl; return 0; }3、吃东西,N,M是中餐和晚餐的个数,T是需要满足的最少的美味值
输入:N行,每行两个数,xi和yi分别表示热量和美味值,再输入M行,每行两个数,xi和yi分别表示热量和美味值。
输出:中餐和晚餐的美味值>=T的情况下,热量值是多少?
思路:暴力。。。。对。。只会暴力。。 选中餐中一个,判断美味值是否满足,满足的话记录最小值;不满足的话再从晚餐中选,如果两个美味值加起来满足,则记录最小值。
当然,这种方法只能过50%……………………
答完后,请教一个大佬同学,得知可以对这个暴力方法进行优化:先按照热量,将早餐和晚餐进行排序。 然后单独判断午餐,找到符合要求的美味值后,后面剩余的都不需要遍历了,单独判断晚餐的情况同理。对于午餐和晚餐都选的情况,当找出复合要求的晚餐后,对于后续的遍历,就不需要遍历该晚餐之后的晚餐了。(这种方法可以AC)
这里就只贴自己的代码了。
#include<iostream> #include<vector> using namespace std; class FoodInf { public: int X; int Y; }; int main() { int N, M, T; cin >> N >> M >> T; if (T == 0) { cout << 0 << endl; return 0; } FoodInf fd; vector<FoodInf> ZhongC; vector<FoodInf> WanC; for (int i = 0; i < N; i++) { cin >> fd.X; cin >> fd.Y; ZhongC.push_back(fd); } for (int i = 0; i < M; i++) { cin >> fd.X; cin >> fd.Y; WanC.push_back(fd); } int minX = 99999; int selX = 0, selY = 0; for (int i = 0; i < N; i++) { selX = ZhongC[i].X; selY = ZhongC[i].Y; if (selY >= T) if (selX < minX) minX = selX; //只吃一顿 for (int j = 0; j < M; j++) { if (selY + WanC[j].Y >= T) if (selX + WanC[j].X < minX) minX = selX + WanC[j].X; } } for (int i = 0; i < M; i++) { selX = WanC[i].X; selY = WanC[i].Y; if (selY >= T) if (selX < minX) minX = selX; //只吃一顿 } cout << (minX == 99999 ? -1 : minX) << endl; return 0; }