Uva12210-A Match Making Problem
对于每个数字二分找到大于等于它的数,再暴力找到第一个小于它的数
1 #include<bits/stdc++.h> 2 3 #define inf 0x3f3f3f3f 4 5 const int maxn=10000; 6 7 using namespace std; 8 9 int b,s; 10 11 int icase; 12 13 int m[maxn+10],w[maxn+10]; 14 15 int flag[maxn+10]; 16 17 int flagm[maxn+10]; 18 19 bool cmp(int a,int b){ 20 return a>b; 21 } 22 23 int firstmin(int val){ 24 for(int i=1;i<=s;i++){ 25 if(w[i]>=val){ 26 return i-1; 27 } 28 } 29 return s; 30 } 31 32 void solve(){ 33 34 int x=b,y=0; 35 memset(flag,0,sizeof(flag)); 36 memset(flagm,0,sizeof(flagm)); 37 sort(m+1,m+b+1); 38 sort(w+1,w+s+1); 39 for(int i=b;i>=1;i--){ 40 int t=x; 41 int p=lower_bound(w+1,w+s+1,m[i])-w; 42 int q=firstmin(m[i]); 43 // printf("%d %d\n",p,q); 44 if(p==s+1){ 45 if(!flag[q]){ 46 flag[q]=1; 47 x--; 48 } else{ 49 for(int h=q-1;h>=1;h--){ 50 if(!flag[h]){ 51 flag[h]=1; 52 x--; 53 break; 54 } 55 } 56 } 57 } else if(q==0){ 58 if(!flag[p]){ 59 flag[p]=1; 60 x--; 61 } else { 62 for(int h=p+1;h<=s;h++){ 63 if(!flag[h]){ 64 flag[h]=1; 65 x--; 66 break; 67 } 68 } 69 } 70 } else if(p!=s+1&&q!=0){ 71 int r=inf,v=inf; 72 if(!flag[p]){ 73 r=abs(m[i]-w[p]); 74 } 75 if(!flag[q]){ 76 v=abs(m[i]-w[q]); 77 } 78 if(!flag[p]&&!flag[q]){ 79 if(v<=r){ 80 flag[q]=1; 81 x--; 82 } else { 83 flag[p]=1; 84 x--; 85 } 86 } else if(flag[p]&&!flag[q]){ 87 flag[q]=1; 88 x--; 89 } else if(!flag[p]&&flag[q]){ 90 flag[p]=1; 91 x--; 92 } else if(flag[p]&&flag[q]){ 93 int f=0; 94 for(int h=q+1;h<p;h++){ 95 if(!flag[h]){ 96 flag[h]=1; 97 x--; 98 f=1; 99 break; 100 } 101 } 102 if(!f){ 103 int ff=0,fff=0; 104 for(int h=p+1;h<=s;h++){ 105 if(!flag[h]){ 106 ff=h; 107 break; 108 } 109 } 110 for(int h=q-1;h>=1;h--){ 111 if(!flag[h]){ 112 fff=h; 113 break; 114 } 115 } 116 if(ff&&fff){ 117 if(abs(m[i]-w[ff])<=abs(m[i]-w[fff])){ 118 flag[ff]=1; 119 x--; 120 } else { 121 flag[fff]=1; 122 x--; 123 } 124 } else if(ff&&!fff){ 125 flag[ff]=1; 126 x--; 127 } else if(!ff&&fff){ 128 flag[fff]=1; 129 x--; 130 } 131 } 132 } 133 134 } 135 if(t==x+1) flagm[i]=1; 136 } 137 for(int i=1;i<=b;i++){ 138 if(!flagm[i]) { 139 y=i; 140 break; 141 } 142 } 143 printf("%d",x); 144 if(x) printf(" %d",m[y]); 145 } 146 147 void input(){ 148 for(int i=1;i<=b;i++){ 149 scanf("%d",&m[i]); 150 } 151 for(int i=1;i<=s;i++){ 152 scanf("%d",&w[i]); 153 } 154 printf("Case %d: ",++icase); 155 } 156 157 int main() 158 { 159 //freopen("e:\\duipai\\out1.txt","w",stdout); 160 while(scanf("%d%d",&b,&s)!=EOF&&(b||s)){ 161 input(); 162 solve(); 163 printf("\n"); 164 } 165 return 0; 166 }