- 瑞士轮
- 2019-03-01 15:49:13 @
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
namespace SwissRound
{
class Player : IComparable<Player>
{
public int Score { get; set; }
public int Rank { get; set; }
public int Number { get; set; }
public int CompareTo(Player other)
{
if (Score > other.Score)
return -1;
else if (Score < other.Score)
return 1;
else
{
if (Number < other.Number)
return -1;
else
return 1;
}
}
}
class Program
{
static int N;
static int Total;
static bool Compete(Player a, Player b)
{
if (a.Rank > b.Rank)
{
a.Score++;
return true;
}
else
{
b.Score++;
return false;
}
}
static void Merge(Queue<Player> players, Queue<Player> winners, Queue<Player> losers)
{
for (int i = 0; i < Total; i++)
{
if(losers.Count==0)
{
players.Enqueue(winners.Dequeue());
}
else if(winners.Count==0)
{
players.Enqueue(losers.Dequeue());
}
else if(winners.Peek().CompareTo(losers.Peek())==-1)
{
players.Enqueue(winners.Dequeue());
}
else
{
players.Enqueue(losers.Dequeue());
}
}
}
static void Main(string[] args)
{
//FileStream file = new FileStream("input.in", FileMode.Open);
//StreamReader input = new StreamReader(file);
List<int> param = Console.ReadLine().Split(' ').ToList()
.ConvertAll((x) => int.Parse(x));
N = param[0];
Total = N * 2;
int R = param[1], Q = param[2];
param = null;
List<int> initialScores = Console.ReadLine().Split(' ').ToList()
.ConvertAll((x) => int.Parse(x));
List<int> ranks = Console.ReadLine().Split(' ').ToList()
.ConvertAll((x) => int.Parse(x));
List<Player> players = new List<Player>(2 * N);
for (int i = 0; i < Total; i++)
{
Player player = new Player();
player.Score = initialScores[i];
player.Rank = ranks[i];
player.Number = i + 1;
players.Add(player);
}
players.Sort();
Queue<Player> winners = new Queue<Player>(N);
Queue<Player> losers = new Queue<Player>(N);
Queue<Player> playerQueue = new Queue<Player>(2 * N);
Player a, b;
foreach(Player p in players)
{
playerQueue.Enqueue(p);
}
for (int i = 0; i < R; i++)
{
for (int j = 0; j < N; j++)
{
a = playerQueue.Dequeue();
b = playerQueue.Dequeue();
if (Compete(a, b) == true)
{
winners.Enqueue(a);
losers.Enqueue(b);
}
else
{
winners.Enqueue(b);
losers.Enqueue(a);
}
}
Merge(playerQueue, winners, losers);
}
Console.WriteLine(playerQueue.ToList()[Q - 1].Number);
//Console.ReadLine();
}
}
}
不知道有没有办法优化。
0 条评论
目前还没有评论...