超时代码:
时间复杂度o(n*n),导致超时
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef struct{
int a,b;
int t1,t2;
}couple;
int main(){
int n,m,k=0;
int s,emp[100000];
cin>>n;
couple c[50000]={0};
for(int i=0;i<n;i++){
cin>>c[i].a>>c[i].b;
}
cin>>m;
for(int i=0;i<m;i++){
cin>>s;
int f=0;
for(int j=0;j<n;j++){
if(s==c[j].a){
c[j].t1=1;
f=1;
break;
}
else if(s==c[j].b){
c[j].t2=1;
f=1;
break;
}
}
if(f==0){
emp[k++]=s;
// cout<<emp[k-1]<<"!!!!!!!!!!!!!!!!!!"<<k<<endl;
}
}
for(int i=0;i<n;i++){
if(c[i].t1!=c[i].t2){
if(c[i].t1)
emp[k++]=c[i].a;
else
emp[k++]=c[i].b;
}
}
printf("%d",k);
sort(emp,emp+k);
for(int i=0;i<k;i++)
if(i==0)
printf("%05d",emp[i]);
else
printf(" %05d",emp[i]);
return 0;
}
AC代码:
将编号都映射在同一张表的序号上。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef struct{
int part; //对象编号
int t; //是否在场
}people;
int main(){
int n,m,k=0,a,b;
int s,emp[100000];
cin>>n;
people c[100000]={0};
for(int i=0;i<100000;i++){ //将每个对象的编号初始化-1,防止与0号相同;
c[i].part=-1;
}
for(int i=0;i<n;i++){
cin>>a>>b;
c[a].part=b;
c[b].part=a;
}
cin>>m;
for(int i=0;i<m;i++){
cin>>s;
if(c[s].part>=0){ //如果此人有对象
c[s].t=1; //人来现场了
}
else{
emp[k++]=s; //根本没有对象的人
}
}
for(int i=0;i<100000;i++){
if(c[i].t!=c[c[i].part].t&&c[i].t){ //在来到现场,且有对象的人当中,对象却没有来
emp[k++]=i;
}
}
printf("%d\n",k);
sort(emp,emp+k);
for(int i=0;i<k;i++)
if(i==0)
printf("%05d",emp[i]);
else
printf(" %05d",emp[i]);
return 0;
}