第一題,給一個數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; } }