1. 程式人生 > >hdu 1052 Tian Ji -- The Horse Racing

hdu 1052 Tian Ji -- The Horse Racing

題目真的是有點長。

題意:

兩組相同數量的數字,兩兩對比不能重複使用,如果第一組的一個大於第二組的一個則加200分,小於減200分,等於不加不減。

思路:

先將兩組都按照從小到大進行排列,貪心的思路記下來第一組比第二組大的數量。具體就是,當成兩個指標,分別表示當前比較位置,

1. 如果第一個大於第二個則加分,兩個指標均向後移動

2. 如果第一個等於第二個,則可能是平,不計分,但相等的時候我們可以先記錄下來這個相等資訊,因為如果這個數用來和對方大的數比較輸了,可以換來自己的一個數大於對方這個數,得分也是0,但如果這時候平了,但是對方的大數,打敗了自己方本來可以贏這個數的那個數,總體來說,己方輸了一個數,所以最差的方式是相等,但如果讓自己方一個數贏了,可能會挽救一次自己比輸。於是,當兩個數相等時,先將這個相等資訊儲存,如果後面有相等或者小於正在比較的,可以看看是否能大於這個數。同理,相等的時候先看一下之前的記錄裡是否有相等的記錄。

3. 如果第一個小於第二個,看一下相等的記錄裡有咩有可以挽救一下的。不然,第二個指標不動,第一個繼續向前。

最後總數減去第二個剩的沒有比較的數量,就是第一個輸了的個數。

寫的比較亂,表達不明白,還是看程式碼吧。

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
int a[1010], b[1010];
int main()
{
    int n;
    while(cin>>n)
    {
	queue<int >q;
        if(n==0) break;
        for(int i=0;i<n;i++)
            cin>>a[i];
        for(int i=0;i<n;i++)
            cin>>b[i];
        sort(a,a+n);
        sort(b,b+n);
        int j=0;
        int eq=0;
        int sum=0;
        for(int i=0;i<n;i++)
        {
            if(a[i]>b[j])
            {
                sum++;
        	j++;
            }
            else if(a[i]==b[j])
            {
		 if(!q.empty()&&(a[i]>q.front()))
		 {
			sum++;
			q.pop();
		 }
		 else
		 {
			q.push(a[i]);
			j++;
		}
       		
       	    }
            else
            {
		 if(!q.empty()&&(a[i]>q.front()))
                 {
                        sum++;
                        q.pop();
                 }
            }
         }
         sum=sum-(n-j);
//    if(sum<0) cout<<0<<endl;
         cout<<sum*200<<endl;
     }    
}