7-10 抢楼层 (20分) ---注意歧义啊!

暴雪公司周年庆,在论坛推出盖楼抢楼层活动,幸运儿获得霜之叹息一把,于是大家蜂拥而至,开始抢楼了,你的任务就是找出幸运儿。

输入格式:

第一行中输入三个整数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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值