暴雪公司周年庆,在论坛推出盖楼抢楼层活动,幸运儿获得霜之叹息一把,于是大家蜂拥而至,开始抢楼了,你的任务就是找出幸运儿。
输入格式:
第一行中输入三个整数N,K,S,N是楼层总数,不超过1000,K是间隔多少楼层产生幸运儿,S是第一个幸运儿的楼层编号,楼层从1开始编号。随后的N行,是各楼层的跟帖人的昵称,昵称是一个不超过20个字符的字符串,不含空格。事情原本很简单,但是霜之叹息太诱人了,于是很多人重复发帖,希望能抢到楼层,但是暴雪公司规定,每个人最多只能得1把霜之叹息,如果已经得过了,那就要跳过。
输出格式:
对每一组输入,输出幸运儿的昵称,一行一个,如果没人被选中,那就输出No one was chosen
。
输入样例1:
在这里给出一组输入。例如:
10 3 1
Underneath
Weddinginthedream
Queen
WaitingforLove
Drinktowind
Bodyontheocean
Dark
Lolita
Thedreamofyou
Smilelikeflower
输出样例1:
在这里给出相应的输出。例如:
Underneath
WaitingforLove
Dark
Smilelikeflower
输入样例2:
在这里给出一组输入。例如:
2 3 3
Underneath
Weddinginthedream
输出样例1:
在这里给出相应的输出。例如:
No one was chosen
题解
我是万万没想到啊,吃了没审题的亏。
其实这题本身没啥,就是跳多少个判断一个拿不拿奖。题目介绍却是略有歧义。
歧义1.:K是间隔多少楼层产生幸运儿
间隔多少楼?是说a和b楼之间楼的数目吗?
其实并不是。只是 b=a+K 而已。这个看样例1就可以明白。
歧义2:每个人最多只能得1把霜之叹息,如果已经得过了,那就要跳过
啥叫跳过?要跳过多少?
是这个人不算然后向下再跳K个再判断,还是这个人不算而判断他下面紧接着的那个人?
经过实验,是后者。
奈何本人当时没看到这层歧义,试了好多种情况,改了很长时间。
结果...
最离谱的地方就在于,我的跳出想法是错的,竟然还能过3个点,就给我一种总体思路对了但就差一些细节的感觉。
而实际上,千差万别呀。
知道了这两个歧义的解读,剩下也就没什么了。
还是用C++的string数组好用,然后用栈的思想将获奖人名写入数组就行啦。
ac代码
#include<bits/stdc++.h>
using namespace std;
int i,N,K,S,top=0;
string a;
string s[200]; //获奖人名数组
bool have(string a) //判断字符串a有木有在s中存在
{
for(int i=1;i<=top;i++)
{
if(a==s[i])
return true;
}
return false;
}
int main()
{
int flag=0;
cin>>N>>K>>S;
for(i=1;i<=N;i++)
{
cin>>a;
if(i==S)
{
cout<<a<<endl;
s[++top] = a;
flag=1;
break;
}
}
if(flag==0)
{
cout<<"No one was chosen\n";
return 0;
}
int count=1;
for(i=1;i<=N-S;i++)
{
cin>>a;
if(count%K==0)
{
if(have(a)==false)
{
cout<<a<<endl;
s[++top] = a;
}
else continue; //有了就走下一次循环,count没有++,故仍然会保持整除状态
}
count++;
}
return 0;
}