认真审题!题目说找出所有可能的复读机,而聊天记录有可能有些人没出现,那么没出现的人都有可能是复读机,由于复读机永远是在复读,所有是复读机的群友一共有两种,一是在聊天记录中复读的,二是没有出现在聊天记录中的,那这时候我们只要把聊天记录中没有复读的群友和第一个发言的人做标记,那么剩下的都是有可能为复读机的。信心满满写下第一次代码
#include <cstdio>
#include <cstring>
using namespace std;
struct content
{
char a[11];
int num,flag;
}people[103];
int main()
{
int i,kount=0,n,m;
scanf("%d%d",&n,&m);
for(i=1; i<=m; i++)
{
scanf("%d%s",&people[i].num,people[i].a);
people[i].flag = 0;
}
people[1].flag = 1;
for(i=2; i<=m; i++)
{
if((strcmp(people[i-1].a,people[i].a)) != 0 && people[i].num != people[i-1].num && people[i].flag == 0)
{
people[i].flag = 1;
}
}
for(i=1; i<=m; i++)
{
if(people[i].flag != 1)
printf("%d\n",people[i].num);
}
啊。。。怎么连本地都没过。。思路这么清晰,怎么会错呢,想了很久,最终决定求助大佬,大佬说那是因为我的people数组是一条聊天内容,所以我标记的其实是聊天内容,而不是群友!!我恍然大悟,于是在原程序上修改了一下就a了
ac代码
#include <cstdio>
#include <cstring>
using namespace std;
struct content
{
char a[105];
int num;
}people[1003];
int member[1003];
int main()
{
int i,n,m;
scanf("%d%d",&n,&m);
for(i=1; i<=m; i++)
{
scanf("%d%s",&people[i].num,people[i].a);
member[people[i].num] = 0;
}
member[people.[1].num] = 1;
for(i=2; i<=m; i++)
{
if((strcmp(people[i-1].a,people[i].a)) != 0 && people[i].num != people[i-1].num && member[people[i].num] == 0)
{
member[people[i].num] = 1;
}
}
for(i=1; i<=n; i++)
{
if(member[i] == 0)
printf("%d ",i);
}
}