PAT A1124 Raffle for Weibo Followers
Sample Input 1:
9 3 2
Imgonnawin!
PickMe
PickMeMeMeee
LookHere
Imgonnawin!
TryAgainAgain
TryAgainAgain
Imgonnawin!
TryAgainAgain
Sample Output 1:
PickMe
Imgonnawin!
TryAgainAgain
Sample Input 2:
2 3 5
Imgonnawin!
PickMe
Sample Output 2:
Keep going...
- 思路 1:
hash线性探测:题意比较隐晦,看到skip才猜出意思,输入3个数n转发数,m每次跳数,s起点(第一个获奖者)
- 每探测到一个元素,先判断它是否在已获奖名单,若是新的(未获奖者),将他加入获奖名单,同时加入获奖者set(方便查找)
- 若探测到已经在集合的人,查找他的下一个人
#include <iostream>
#include <unordered_set>
#include <vector>
using namespace std;
const int maxn = 1010;
string name[maxn];
unordered_set<string> se;
vector<string> winner;
int main(){
int m, n, s;
scanf("%d %d %d", &m, &n, &s);
for(int i = 1; i <= m; ++i) cin >> name[i];
int idex = s;
while(idex <= m){
if(se.find(name[idex]) == se.end()){
winner.push_back(name[idex]);
se.insert(name[idex]);
idex += n;
}else idex++;
}
if(winner.size() == 0) printf("Keep going...");
else for(int i = 0; i < winner.size(); ++i) cout << winner[i] << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
unordered_map<string, bool> mp;
int main(){
int m, n, s;
scanf("%d %d %d", &m, &n, &s);
bool flg = true;
for(int i = 1; i <= m; ++i){
string name;
cin >> name;
if(i >= s && (i - s) % n == 0){
if(mp[name] == false){
cout << name <<endl;
flg = false;
mp[name] = true;
}else{
s++;
}
}
}
if(flg) printf("Keep going...");
return 0;
}
#include <bits/stdc++.h>
using namespace std;
unordered_map<string, bool> has;
int main()
{
int n, skip, winner;
bool flg = true;
scanf("%d %d %d", &n, &skip, &winner);
for(int i = 1; i <= n; ++i)
{
string name;
cin >> name;
if(i == winner)
{
if(has[name] == false)
{
cout << name <<endl;
has[name] = true;
winner += skip;
}else winner++;
flg = false;
}
}
if(flg) printf("Keep going...");
return 0;
}