AtCoderのARC
次のARCの問題へ
前のARCの問題へ
ARC106-C Solutions
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("5 1");
//1 10
//8 12
//13 20
//11 14
//2 4
}
else if (InputPattern == "Input2") {
WillReturn.Add("10 -10");
//-1
}
else if (InputPattern == "Input3") {
WillReturn.Add("10 9");
//-1
}
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 (M < 0) {
Console.WriteLine(-1);
return;
}
if (M == 0) {
for (int I = 1; I <= N; I++) {
Console.WriteLine("{0} {1}", I * 2, I * 2 + 1);
}
return;
}
if (M > 0) {
// 可能な差の範囲
if (1 <= M && M <= N - 2) {
var sb = new System.Text.StringBuilder();
long BigNum = 10000000;
sb.AppendFormat("{0} {1}", 1, BigNum);
sb.AppendLine();
int RestRange = N - 1;
int RestDiff = M;
int CurrSta = 2;
while (RestDiff > 0) {
sb.AppendFormat("{0} {1}", CurrSta, CurrSta + 1);
sb.AppendLine();
if (CurrSta > 2) {
RestDiff--;
}
CurrSta += 2;
RestRange--;
}
for (int I = 1; I <= RestRange; I++) {
sb.AppendFormat("{0} {1}", BigNum + I * 2, BigNum + I * 2 + 1);
sb.AppendLine();
}
Console.Write(sb.ToString());
}
else {
Console.WriteLine(-1);
return;
}
}
}
}
解説
場合に分けて考えます。
Mが負になるのは、高橋君のアルゴリズムより
青木君のアルゴリズムのほうが良いデータの時ですが
高橋君のアルゴリズムは、区間の終了が早いものを貪欲に取るという
最適アルゴリズムなので、
Mが負になるのは、ありえないです。
Mが0になるのは、高橋君のアルゴリズムと
青木君のアルゴリズムで、結果が同じになるデータの時なので
これは、OverLapしない区間を、N個作れば良いです。
Mが正になるのは、高橋君のアルゴリズムが
青木君のアルゴリズムより良い結果になるデータの時ですが、
青木君のアルゴリズムの結果が1という条件付きで
高橋君のアルゴリズムの最良結果は(区間の数-1)なので
差の最大値は、区間の数-2
になります。
なので、Mが達成可能なデータなら、そのデータを構築し、
達成不可なら-1を出力すれば良いです。