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;
} 
京公网安备 11010502036488号