hdu 1052 Tian Ji -- The Horse Racing
阿新 • • 發佈:2018-12-17
題目真的是有點長。
題意:
兩組相同數量的數字,兩兩對比不能重複使用,如果第一組的一個大於第二組的一個則加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; } }