zoj2397

来源:互联网 发布:时间煮雨 歌词 知乎 编辑:程序博客网 时间:2024/04/26 15:08

#include <iostream>  
using namespace std;  
int T[1001],K[1001];  
 
int cmp(const void* a,const void *b)  
{  
    return *(int *)b-*(int *)a;  
}  
 
 
int main()  
{  
    int n,i,sum;  
    int flag;  
    int t_tail,t_head,k_tail,k_head;  
    while (scanf("%d",&n)!=EOF && n)  
    {  
        for(i=0;i<n;i++)  
            scanf("%d",&T[i]);  
        for(i=0;i<n;i++)  
            scanf("%d",&K[i]);  
          
        qsort(T,n,sizeof(T[0]),cmp);   //从大到小排!!!
        qsort(K,n,sizeof(K[0]),cmp);  
        sum=0;  
        flag=1;  
        k_head=t_head=0;  
        k_tail=t_tail=n-1;  
          
        while(t_head<=t_tail && k_head<=k_tail)  
        {  
            if(T[t_head]>K[k_head])  
            {     
                sum+=200;  
                t_head++;  
                k_head++;  
            }  
//或将其归到else中  
            else if(T[t_head]<K[k_head])  
            {  
                sum-=200;  
                t_tail--;  
                k_head++;  
            }  
            else   //当前马速度相等时!!!
            {  
                while(t_head<=t_tail && k_head<=k_tail)  
                {     
                    if(T[t_tail]>K[k_tail])   //从最小的中找去不能赢相应位置k马的T马!!!
                    {  
                        sum+=200;  
                        t_tail--;  
                        k_tail--;  
                    }  
                    else 
                    {  
                        if(T[t_tail] <K[k_head])  
                            sum-=200;  
                        t_tail--;  
                        k_head++;  
                        break;  
                    }  
                }  
            }  
          //  if(T[t_tail]>K[k_head])  
          //  {  
          //      flag=1;  
          //      break;  
          //  }             
        }  
       // if(flag==1)  
        //    sum+=(t_tail-t_head+1)*200;  
        printf("%d/n",sum);  
    }  
    return 0;  


/*总体的思想就是 田忌以最小代价赢齐王 最小代价输齐王 齐王以最大代价赢田忌 最大代价输田忌

先从大到小排序

(1)当田忌当前最快的马快于齐王当前最快的马 则以最小代价去赢齐王

     这时有两种选择 一是以当前最慢的马去输给齐王 二是以当前最快的马去赢齐王 因为田忌以当前最快的马可以赢齐王任何的马 很明显应

     该去赢齐王当前最快的马(迟早都要比 当然跟最强的比)  所付出的代价是最小的 也就是两者的差是最小的

(2)当田忌当前最快的马与齐王当前最快的马速度相同时

     这个时候如果直接用当前最慢的马去输给齐王是否是最小代价呢 从上面两组数据可以发现 如果当前最慢的马不是目前所有马中最慢的 

     即不是最小代价 因为当前最慢的马还可以以最小代价赢 以此往前推 直到用当前最慢的马去输给齐王。

(2)当田忌当前最快的马慢于齐王当前最快的马 则直接用当前最慢的马去输给齐王 或同第二种情况(刚发现)

     因为在田忌当前的马中没有快于齐王当前最快的马的时候 以最慢的马与齐王最快的马比 能让田忌损失的代价最小 齐王需要的代价最大

     也就是两者的差最大 。

     刚在考虑这样一个问题 按网上大牛们的方法 为什么第三种情况就直接用田忌当前最慢的马去输掉 而不是同第二种情况?

     于是试着把第三种情况归到第二种情况中 也神奇地通过了~

     郁闷了~*/

 

原创粉丝点击