• 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
    ",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("
    ");
    164     }
    165     return 0;
    166 }
    
    
    
    
    
  • 相关阅读:
    Java开发web的几种开发模式
    Tomcat7.0安装配置
    Apache与Tomcat 区别联系
    编写 Window 服务程序
    系列文章--SharePoint 开发教程
    Google Chrome浏览器调试功能介绍
    Chrome的JS调试工具
    Google Chrome 调试JS简单教程[更新]
    ASP.NET常用标准配置web.config
    WINDOWS下kill进程的命令
  • 原文地址:https://www.cnblogs.com/GeniusYang/p/5750678.html
Copyright © 2020-2023  润新知