sdnuoj1533(水题)
1533.寻找复读机
某小队里一共有 n 个人,他们的编号是 1…n,其中有一些人本质上是复读机。底层群员柳予欣发现,如果一个人的本质是复读机,那么他每次发的消息一定跟群里的上一条消息一样,特别地第一个发消息的人一定不是复读机。某不愿透露姓名的管理员现在搞到了一份聊天记录,他想请你找出所有可能是复读机的群友。
Input
多组输入。每组输入的第一行两个正整数 n,m,表示群里的人数和聊天记录的总条数。接下来 m 行按时间顺序给出聊天记录,每行有一个正整数 x 和一个小写字母字符串 S,表示群友 x 发了消息 S。1≤ n≤ 10001≤ m≤ 10001≤ |S|≤ 100
Output
输出一行,将所有可能是复读机的群友的编号按照从小到大排序后输出,每两个编号之间隔一个空格。
Sample Input
3 5
1 gugugu
2 gugugu
1 gugu
3 tingzhifudu
2 tingzhifudu
Sample Output
2
一开始这样写的a[1005]={1},结果是出不来结果,基础不扎实,不知道这样写只有第一个赋为了1.。。。。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m,a[10005],b,i;
string s,c;
while(scanf("%d%d",&n,&m)!=EOF&&n+m!=0)
{
memset(a,0,sizeof(a));
for(i=0;i<m;i++)
{
scanf("%d",&b);
cin>>s;
if(i==0)
{
c=s;
a[b]=1;
}
else
{
if(s!=c)
{
a[b]=1;
c=s;
}
}
}
int f=0;
for(i=1;i<=n;i++)
{
if(!a[i])
{
if(f)
cout<<" ";
f=1;
cout<<i;
}
}
cout<<'\n';
}
return 0;
}
当然可以用map
#include <cstdio>
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
int main()
{
map<int,int>mp;
string s[1005];
int a[1005],n,f,m,i,j;
while(scanf("%d%d",&n,&m)!=EOF&&n+m!=0)
{
for(i=1;i<=m;i++)
{
scanf("%d",&a[i]);
cin>>s[i];
}
for(i=1;i<=n;i++)
mp[i]=1;
mp[a[1]]=0;
for(i=2;i<=m;i++)
{
if(s[i]!=s[i-1])
mp[a[i]]=0;
}
f=0;
for(i=1;i<=n;i++)
{
if(!mp[i])
continue;
if(f)
cout<<" ";
f=1;
cout<<i;
}
cout<<'\n';
}
return 0;
}