PAT 乙级 1069 微博转发抽奖
1. 题目简述及在线测试位置
1.1 给定N个字符串、字符串打印间隔 和 需要打印的第一个字符串编号F 。若F>N,输出"Keep going…" ;若当前字符串已经打印,则顺延
1.2 在线测试位置: PAT 1069 微博转发抽奖
2. 基本思路
2.1 本题的难点:如何识别出字符串已经打印。我的方法是使用STL map 。map是STL的一个关联容器(容器负责数据的存储),它提供一对一的数据处理能力:第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可以称为该关键字的值。
2.2 map 的关键字用于存储字符串,对应的值用于标示字符串是否已打印
map<string, bool> Judge; //Judge中的string不能重复
.....
Judge[Str] = 0; //初始值为0 代表未打印;打印后,则赋值为1
3. 完整AC代码
#include <map> //map
#include <iostream>
using namespace std;
#define MAX 1001
int main()
{
int Number, Step, First; //字符串的数量 字符串打印间隔 待打印的首个字符串编号
cin >> Number >> Step >> First;
string Name, a[MAX];
map<string, bool> Judge; //Judge中的string不能重复
for (int i = 1; i <= Number; i++) //输入的字符串从1开始编号、输入的字符串可能重复
{
cin >> Name;
a[i] = Name;
Judge[Name] = 0;//默认值为0 代表未显示
}
if (First > Number)
cout << "Keep going...";
else
{
cout << a[First] << endl;
Judge[a[First]] = 1; //字符串已打印
First += Step;
while (First <= Number )
{
if (Judge[a[First]] == 0) //未打印
{
cout << a[First] << endl;
Judge[a[First]] = 1;
First += Step;
}
else
First++; //字符串已打印,执行顺延
}
}
return 0;
}