解题思路:1、标记是否是单身,如果单身,则直接加入输出数组,如果不单身,则寻找其伙伴是否出现在派对中,如果没出现,则加入输出数组
2、对输出数组升序输出
#include <stdio.h> #include <string.h> #define MAX 100000 int a[MAX]; void Init(int a[]) {//初始化标记数组 int i; for(i=0; i<MAX; i++) { a[i]=-1; } } int cmp(const void *a,const void *b) { return (*(int *)a-*(int *)b); } int IsSingle(int x) {//判断是否单身 if(a[x]==-1) return 1; return 0; } int FindPartner(int x,int arr[],int m) {//查找伙伴是否参加派对里 int i; for(i=0; i<m; i++) { if(a[x]==arr[i]) { return 1; } } return 0; } int Partition(int a[],int low,int high) { int pivot=a[low]; while(low<high) { while(low<high) { if(a[high]<pivot) { a[low]=a[high]; break; } high--; } while(low<high) { if(a[low]>pivot) { a[high]=a[low]; break; } low++; } } a[low]=pivot; return low; } void Sort(int a[],int low,int high) { if(low<high) { int t=Partition(a,low,high); Sort(a,low,t-1); Sort(a,t+1,high); } } int main() { int n; scanf("%d",&n); int i,x,y; for(i=0; i<n; i++) { scanf("%d %d",&x,&y); a[x]=y; a[y]=x; } int m; scanf("%d",&m); int arr[m],s[m]; memset(s,0,sizeof(s)); memset(arr,0,sizeof(arr)); for(i=0; i<m; i++) { scanf("%d",&arr[i]); } int k=0; for(i=0; i<m; i++) { if(IsSingle(arr[i])) { s[k++]=arr[i]; } else { if(!FindPartner(arr[i],arr,m)) s[k++]=arr[i]; } } Sort(s,0,k-1); for(i=0; i<k; i++) { if(i) printf(" "); printf("%05d",s[i]); } }