AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC165-E Rotation Matching
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("4 1");
//2 3
}
else if (InputPattern == "Input2") {
WillReturn.Add("7 3");
//1 6
//2 5
//3 4
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = InputList[0].Split(' ').Select(pX => int.Parse(pX)).ToArray();
int N = wkArr[0];
int M = wkArr[1];
// 奇数の場合
if (N % 2 == 1) {
int Val1 = 2;
int Val2 = N;
for (int I = 1; I <= M; I++) {
Console.WriteLine("{0} {1}", Val1, Val2);
Val1++;
Val2--;
}
}
// 偶数の場合
if (N % 2 == 0) {
// 対角線の数
int Wa = N + 2;
int AllCrossCnt = 0;
for (int I = 2; true; I++) {
int PairVal = Wa - I;
if (PairVal <= I) break;
AllCrossCnt++;
}
int AppearCrossCnt = 0;
int Val1 = 2;
int Val2 = N;
for (int I = 1; I <= M; I++) {
AppearCrossCnt++;
if (AppearCrossCnt * 2 > AllCrossCnt) {
Console.WriteLine("{0} {1}", Val1 + 1, Val2);
}
else {
Console.WriteLine("{0} {1}", Val1, Val2);
}
Val1++;
Val2--;
}
}
}
}
解説
円周上で考え、
偶数か奇数かで場合分けします。
奇数で9人の場合、
9-2
8-3
7-4
6-5
といった対角線が解になります。
偶数で8人の場合、
8-2
7-4
6-5
と中点以下を通る対角線の場合は、
1下げるようにたものが解になります。