题目分析:
策略是充分利用每一匹马的战斗力,若己方的最好马优于对方的最好马,则使己方的最好马战胜对方的最好马;若己方的最好马劣于对方的最好马,则必定要输一次,用己方最劣的一匹马消耗对方的最好马,从而使己方的最好马可以对战对方下一个等级的马,增大赢的概率。当双方的最好马实力相当时,为了尽可能多赢,检查双方最劣马的实力,若己方最劣马强于对方,则先用己方最劣马战胜对方最劣马,保证赢一局,若己方最劣马弱于对方,则该匹马注定要输,用其消耗对方最高战斗力。若双方最劣马实力相当,仍用己方最劣马消耗对方最好马,当只看最优和最劣两组数据时,这样最坏的结果是平局,然而可以增大中间数据赢的概率(因为己方的最优马得以对阵对方下一等级的马,且对方下一等级的马战斗力一定小于等于它)。
例题链接:http://www.acmicpc.sdnu.edu.cn/problem/show/1026
#include <cstdio> #include <iostream> #include <algorithm> #include <vector> using namespace std; int main () { int n; int a[10005],b[10005]; cin >> n; for (int i=1;i<=n;i++)cin >> a[i]; for (int i=1;i<=n;i++)cin >> b[i]; sort (a+1,a+1+n); sort (b+1,b+1+n); int a1=1,a2=n; int b1=1,b2=n; int sum=0; int N=n; for(int i=1;i<=n;i++) { if(a[a1]<b[b1]) { sum++; a1++; b1++; } else { if(a[a2]<b[b2]) { sum++; a2--; b2--; } else { if(a[a2]>b[b1]) { a2--; b1++; } else { a2--; b1++; N--; } } } } if(N%2==0) { if(sum>N/2) cout << "WIN" << endl; if(sum==N/2)cout << "DRAW" << endl; if(sum<N/2) cout << "LOSE" << endl; } if(N%2==1) { if(sum>=(N+1)/2)cout << "WIN" << endl; else cout << "LOSE" << endl; } return 0; }