第一题,给一个数A,求A用2-A-1进制表示的所有数的每一位的总和的平均数。
比如5,则用2进制表示为101;3进制表示为12;4进制表示为11,则所有数的总和为1+0+1+1+2+1+1 = 7
平均数为7/3要求表示成不可约分的形式。
思路比较简单辗转相除的方法,求出每一个进制表示的数各个位的总和,然后除以总的个数,这边最需要注意的一个点就是,最后的结果是要表示成不可约分的形势,因此在输出结果时候,还要除以分子和分母的最大公约数。
#include <iostream> #include <vector> using namespace std; int greatDivisor(int num1, int num2) { if (num1 > num2) { return greatDivisor(num1 - num2, num2); } else if (num2 > num1) { return greatDivisor(num1, num2 - num1); } else return num1; } int main() { int A = 0; while (cin >> A) { long long sum = 0; for (int i = 2; i < A; i++) { int temp = A; while (temp) { sum += temp%i; temp /= i; } } int Commondivisor = greatDivisor(sum, A - 2); cout << sum / Commondivisor << "/" << (A - 2) / Commondivisor << endl; } }
第二题:小明有一堆爬上的数据,m和n,m表示第几天,n表示他当天爬的海拔高度,要求是相邻两天的高度差不超过1,并且第一天和最后一天的高度可以是任意输入,他遗失了这份数据中的一部分,问你能不能通过没有遗失的数据求出他可能爬的最高海拔,如果可以输出可能的最高海拔,如果不行,输出“IMPOSSIBLE”;
比如
8 2
2 0
7 0
上面这组数据表示他一共有8天的数据,没有遗失的数据有2天,分别是第2天海拔0,第7天海拔0,则可以发现,如果高度差不超过1,则第4天或者第5天的海拔最高为2,可能的情况为(2,0)(3,1 )(4,2)(5,2 )(6,1) (7,0)
则按要求输出为2
8 3
2 0
7 0
8 3
对于这组数据,由于第7天和第8天相邻两天高度差超过了1,所以输出IMPOSSIBLE
这道题我没有AC,当时想错了一个地方,其实和第一组测试数据很有关系,由于第一组测试数据刚好2,7都为0,并且最高高度为两天的中间那天,所以我简单的把最高高度换乘了0+(7-2)/2,其实这样是不对的,其实这题真的非常简单初中的知识,画一个图解方程就明白了。
这样最大高度的公式就很容易表示了,还需要考虑第一天和最后一天可能的高度,然后再求出最大值。当时被(2,0) (7,0)这两对数据误导,一直没有AC
当然下面的代码我也不保证能够AC。。。。哈哈哈~等下次题目有了再提交看看,如果有什么问题的话欢迎给我留言。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int day; int unmissDay; cin >> day; cin >> unmissDay; vector<pair<int,int>> dayInfo(unmissDay); for (int i = 0; i < unmissDay; i++) { int oneday; //日期 int oneheight; //高度 cin >> oneday; cin >> oneheight; dayInfo[i] = make_pair(oneday,oneheight); } int maxheight = 0; bool flag = true; for (int i = 1; i < unmissDay; i++) { if (dayInfo[i].first - dayInfo[i - 1].first < abs(dayInfo[i].second - dayInfo[i - 1].second)) { flag = false; break; } maxheight = max(maxheight, (dayInfo[i - 1].second + abs(dayInfo[i].second - dayInfo[i - 1].second + dayInfo[i].first - dayInfo[i - 1].first) / 2)); } maxheight = max(maxheight, max(dayInfo[0].second + dayInfo[0].first - 1, dayInfo[unmissDay - 1].second + unmissDay - dayInfo[unmissDay - 1].first)); //需要考虑第一天和最后一天的高度 if (flag) { cout << maxheight << endl; } else { cout << "IMPOSSIBLE" << endl; } }