题目链接:1069 微博转发抽奖
大致思路如下:
- 首先当第一位中奖的人数直接大于总人数时,就可以输出
Keep going...
了,因为这种情况下肯定没人中奖 - 用map做标记,使用用户名string类型作为键,标记int类型作为值,即
map<string,int> mapp;
当mapp["string"] == 1
时,代表这个人已经领过奖品了,所以依次向下顺延,但因为可能顺延不止一次(测试点3不能通过的原因所在)所以需要在此写一个while循环,让i++一直加到mapp["string"] == 0
为止
完整代码如下:
#include<iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
//m转发的总量
//n小明决定的中奖间隔
//s以及第一位中奖者的序号(编号从 1 开始)
int m,n,s;
cin>>m>>n>>s;
if(s > m)
{
cout<<"Keep going...";
return 0;
}
string ss[m];
map<string,int> mapp; //用map做标记
for(int i = 0;i < m;i++)
{
cin>>ss[i];
}
//cout<<endl;
for(int i=s-1;i < m;i += n)
{
if(mapp[ss[i]] == 0)//代表没被领过
{
cout<<ss[i]<<endl;
mapp[ss[i]]++;//标记 已经领过了
}
else if(mapp[ss[i]] == 1)
{
while(mapp[ss[i]] == 1)
i++;
if(mapp[ss[i]] == 0)//代表没被领过
{
cout<<ss[i]<<endl;
mapp[ss[i]]++;//标记 已经领过了
}
}
}
return 0;
}
这样就AC啦~