樂事在線筆試題.

   剛剛忘記了將其他兩道編程題放出來,所以現在補上來。

    第二道的意思是:一個神女幫助主人公升級了精靈,於是主人公想獎勵神女,意識除了支付升級費之外,額外給她一些獎勵。

主要支付升級費A元,主人公攜帶了B元,但是獎勵的條件比較特殊:1.總支付必須爲5的倍數,2.獎勵佔總支出的5%~10%之間(包括邊界),其中1<=A,B<=2000000000 ,且 B>=A

    這個題我的代碼的時間複雜度不夠,我作了一些優化,比如:使每次的獎勵加上原來的支付剛好是5的倍數;獎勵佔總支付的比例超過10%就停止;但是有一點優化的可能不是很到位,假如給定的A很大,所以獎勵的初始值也對應很大,這個值的起始值如何與A配合好沒想清楚,所以這個題需要請教一下大家。下面是我得代碼,時間複雜度不夠。

#include <iostream>
using namespace std;

int main()
{
	int A = 0, B = 0;
	int takes = 0; //小費
	int toatl = 0; //總費
	int solutions = 0;
	while (cin >> A >> B)
	{
		if (A < 1 || A > 2000000000)
		{
			return 0;
		}
		if (B < 1 || B > 2000000000 || B < A)
		{
			return 0;
		}

		int tmp = B - A; //剩餘的錢

		
		int left = 5 - A % 5; 
		int add = 5 - left; ////假如A=3,那麼第一次補充2,第二次補充7...


		//問題出begin的處理上
		int begin = 0;
		if (A * 5 / 100 == 0)
		{
			begin = add;
		}
		else
		{
			begin = A * 5 / 100;
			begin = begin + (5 - (begin + A) % 5); 
		}
		
		for (int i = begin; i < tmp; i = i + 5)
		{
			double discount = (i * 100) / (A + i);
			
			if (discount > 10)
			{
				break;
			}
			else if (discount >= 5)
			{
				++solutions;
			}
		}

		cout << solutions << endl;
	}
	return 0;
}
   

     第三題的大意是,輸入S,且r^2 = S,現在以r爲半徑畫圓(圓心爲 (0,0) ),找出所有的落在圓上的整數點(橫縱座標都爲整數),輸入多組S,找出其滿足的點的個數。這個題就比較簡單了,使用勾股定理就行了。找出一條邊上的,然後乘以4就可以了。

#include <iostream>
using namespace std;

int main()
{
	int s;
	while (cin >> s)
	{
		if (s<1 || s>2000000000)
			return 0;
		
		int count = 0;
		int r = sqrt(s);
		for (int i = 1; i <= r; ++i)
		{
			int left = s - i * i;
			int lr = sqrt(left);
			if (lr*lr + i*i == s)
			{
				++count;
			}
		}
		cout << 4 * count << endl;
	}
	return 0;
}
好了,以上就是這次筆試,吐槽完了,自己下去好好反思去了。
發佈了194 篇原創文章 · 獲贊 88 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章