PAT (Basic Level) 1069 微博轉發抽獎

小明 PAT 考了滿分,高興之餘決定發起微博轉發抽獎活動,從轉發的網友中按順序每隔 N 個人就發出一個紅包。請你編寫程序幫助他確定中獎名單。

輸入格式:
輸入第一行給出三個正整數 M(≤ 1000)、N 和 S,分別是轉發的總量、小明決定的中獎間隔、以及第一位中獎者的序號(編號從 1 開始)。隨後 M 行,順序給出轉發微博的網友的暱稱(不超過 20 個字符、不包含空格回車的非空字符串)。
注意:可能有人轉發多次,但不能中獎多次。所以如果處於當前中獎位置的網友已經中過獎,則跳過他順次取下一位。

輸出格式:
按照輸入的順序輸出中獎名單,每個暱稱佔一行。如果沒有人中獎,則輸出 Keep going…。

輸入樣例 1:
9 3 2
Imgonnawin!
PickMe
PickMeMeMeee
LookHere
Imgonnawin!
TryAgainAgain
TryAgainAgain
Imgonnawin!
TryAgainAgain

輸出樣例 1:
PickMe
Imgonnawin!
TryAgainAgain

輸入樣例 2:
2 3 5
Imgonnawin!
PickMe

輸出樣例 2:
Keep going…

解題思路:
從第一個中獎者開始,通過循環,再次遍歷數組,找到數組裏與該中獎者爲同一人的數組元素下表,在標記數組裏做標記,以此類推。輸出時通過判斷標記數組的標記輸出即可。
附:
1. 要聲明一個k,作用是如果有符合條件的中獎者就不爲初始值。最終需要判斷一下有無中獎者。
2. 難點:如果某一箇中獎者在之前已經中過獎,那麼機會應當輪到下一個中獎者,但是仍然需要判斷該中獎者是不是已經中過獎的,如果是,繼續向下輪。

代碼:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int sum, num, space, i, j, flag[1000] = { 0 }, k = 0;
	string people[1000];
	cin >> sum >> space >> num;
	for (i = 0; i < sum; i++)
	{
		cin >> people[i];
	}
	for (i = num - 1; i < sum; i+=space)
	{
		if (flag[i] == 0)
		{
			cout << people[i] << endl;
			k++;
			for (j = 0; j < sum; j++)
			{
				if (people[i] == people[j])
				{
					flag[j] = 1;
				}
			}
		}
		else if (flag[i] != 0 && i + 1 < sum)
		{
			//cout << people[i + 1] << endl;
			for (j = i + 1; j < sum; j++)
			{
				if (flag[j] == 0)
				{
					cout << people[j] << endl;
					k++;	
					break;
				}
			}
			i = j;
		}
		else if (flag[i] != 0 && i + 1 == sum)
		{
			break;
		}
	}
	if (k == 0)
	{
		cout << "Keep going...";
	}
	return 0;
}

ps:博主能力有限,如果讀者發現什麼問題,歡迎私信或評論指出不足。歡迎讀者詢問問題,樂意盡我所能解答讀者的問題。歡迎評論,歡迎交流。謝謝大家!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章