比赛时,被各种情况绕晕。我还是太菜了 继续加油i
题目大意:
告诉你 N 个人,M次记录 要求 求出可能的一直在会议现场的人的编号 如果说一个人进入or出去会场的时候,会场里还有人,那么这个人就不可能是题目要求的leader;反之,则有可能是.
值得注意的是 题目给你的M次记录是不完整的 有可能在一开始的时候就有人在会场中 需要首先把这些人找出来。
我们可以清楚的知道:所有没有出现过的人,都是可能的leader;所有出现过的人中,最多只有一个是可能的leader。
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n,m,i,j,k;
int id=-1;//id表示可能的leader的编号
int ans=0;//ans 记录会场中存在的人数
int vis[111111],x[111111];//vis[i]=0表示i可能是leader 否则表示一定不是答案
char s[111111][5];
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(vis));
for(i=0; i<m; i++)
{
scanf(" %s %d",s[i],&x[i]);
if(s[i][0]=='+')vis[x[i]]++;
else vis[x[i]]--;
if(vis[x[i]]<0)//找出一开始就在会场中的人数
{
id=x[i];
ans++;
vis[x[i]]=10;
}
}
memset(vis,0,sizeof(vis));
for(i=0; i<m; i++)
{
if(s[i][0]=='+')
{
if(ans>0)
{
vis[x[i]]=1;
if(id==x[i])id=-1;
}
else
{
if(id==-1||id==x[i])
{
id=x[i];
}
else//如果原先假定的leader 与当前条件冲突 那么这两个人就都不是答案
{
vis[id]=1;
vis[x[i]]=1;
id=-1;
}
}
ans++;
}
else
{
if(ans>1)
{
vis[x[i]]=1;
}
else
{
if(id==-1||id==x[i])
id=x[i];
else
{
vis[id]=1;
vis[x[i]]=1;
id=-1;
}
}
ans--;
}
}
ans=0;
for(i=1; i<=n; i++)
if(vis[i]==0)ans++;
printf("%d\n",ans);
for(i=1; i<=n; i++)
if(vis[i]==0)
printf("%d ",i);
printf("\n");
return 0;
}
下面是 来自一个同学的set数组版本
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
char s1[3];
set<int>s;
set<int>st;
int f[100100];
int a[100100];
int cnt;
int main()
{
int n,m,i,j,k,l,flag;
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
cnt=0;
flag=0;
for (i=1;i<=n;i++)
f[i]=1;
for (i=1; i<=m; i++)
{
scanf("%s%d",s1,&k);
a[k]=1;
if (s1[0]=='+')
{
if (!s.empty()||(flag==1&&cnt!=k)) f[k]=0;
s.insert(k);flag=1;
if (f[k])st.insert(k);
if (cnt>0)
{
if (cnt!=k)f[cnt]=0;
cnt=0;
}
}
else
{
flag=1;
if (cnt>0)
{
f[cnt]=0;
cnt=0;
}
if (s.find(k)!=s.end())
{
s.erase(k);
}
else
{
while (!st.empty())
{
int u=*(st.begin());
f[u]=0;
st.erase(u);
}
}
if (!s.empty())f[k]=0;
else cnt=k;
}
}
int ans=0;
for (i=1; i<=n; i++)
{
if (f[i]==1)ans++;
}
printf("%d\n",ans);
for (i=1; i<=n; i++)
{
if (f[i]==1)printf("%d ",i);
}
printf("\n");
}