-
题目大意:John在微博上从转发他post的N个粉丝里抽奖,请帮他生成幸运观众的列表。注意:若选择到的人已经被选过了,就考虑下一个人。
-
思路一:
unordered_set
会自动去重,但是因为unordered_set
存的数据是倒序的,所以再放到vector里转置。
不行!因为unordered_set里数据的存放位置是无序的。 -
思路二:
vector
可用reverse()
进行转置,所以用vector
存中奖者。再用map
记录每个人中奖的次数(把字符串映射成数字有点麻烦,所以没用hash
记录)。 -
知识点:
- set,unordered_set
- map
- vector
- reverse()
-
代码:
#include <iostream> #include <vector> #include <string> #include <map> using namespace std; int main(){ int n, step, first; string f; vector<string> followers; vector<string> winners; map<string, int> record; scanf("%d %d %d", &n, &step, &first); for(int i = 0; i < n; i++){ cin >> f; followers.push_back(f); } for(int i = first - 1; i < n; i += step){ if(i == first - 1 ){ winners.push_back(followers[i]); record[followers[i]]++; } else{ while(record[followers[i]] != 0) i++; if(i != n){ winners.push_back(followers[i]); record[followers[i]]++; } } } if(winners.empty()) printf("Keep going...\n"); else for(auto it : winners) printf("%s\n", it.c_str()); return 0; }
-
总结:
- set,unordered_set:set是有序的(从小到大排序);unordered_set是无序的,数据的存放位置也是是无序的;
- reverse():转置线性容器
- 需
#include <algorithm>
reverse(v.begin(), v.end())
- 和
sort()
一样,只能对线性容器进行排序(如vector
,list
,deque
)。map和set都是按键值对存的,所以不能用。
- 需
【PAT】1124 Raffle for Weibo Followers (20 分)
最新推荐文章于 2022-11-09 21:26:16 发布