題目真的是有點長。
題意:
兩組相同數量的數字,兩兩對比不能重複使用,如果第一組的一個大於第二組的一個則加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;
}
}