結果
| 問題 |
No.545 ママの大事な二人の子供
|
| コンテスト | |
| ユーザー |
14番
|
| 提出日時 | 2017-07-14 23:33:44 |
| 言語 | C#(csc) (csc 3.9.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,616 bytes |
| コンパイル時間 | 1,102 ms |
| コンパイル使用メモリ | 117,548 KB |
| 実行使用メモリ | 416,652 KB |
| 最終ジャッジ日時 | 2024-10-07 23:36:39 |
| 合計ジャッジ時間 | 6,220 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 18 TLE * 1 -- * 13 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Text;
public class Program
{
public void Proc()
{
int itemCount = int.Parse(Reader.ReadLine());
for (int i = 0; i < itemCount; i++) {
this.ShinamonoList.Add(new Shinamono(Reader.ReadLine()));
}
this.ShinamonoList = this.ShinamonoList.OrderByDescending(a => a.ValueA).ToList();
long ans = GetAns(0, Math.Max(this.ShinamonoList.Sum(a => a.ValueA), this.ShinamonoList.Sum(a => a.ValueB)));
Console.WriteLine(ans);
}
private long GetAns(long min, long max) {
if(max-min<=1) {
if(IsValid(0, 0, 0, min)) {
return min;
}
return max;
}
long mid = (max + min) / 2;
if(IsValid(0,0,0,mid)) {
return GetAns(min, mid);
}
return GetAns(mid, max);
}
private Dictionary<int, Dictionary<long, Dictionary<long, Dictionary<long, bool>>>> dic = new Dictionary<int, Dictionary<long, Dictionary<long, Dictionary<long, bool>>>>();
private bool IsValid(int idx, long subtotalA, long subtotalB, long diff) {
if(idx >= this.ShinamonoList.Count) {
return Math.Abs(subtotalA - subtotalB) <= diff;
}
long newSubtotalB = subtotalB + this.ShinamonoList.Skip(idx).Sum(a => a.ValueB);
if (subtotalA - newSubtotalB > diff) {
return false;
}
long newSubtotalA = subtotalA + this.ShinamonoList.Skip(idx).Sum(a => a.ValueA);
if(subtotalB - newSubtotalA>diff) {
return false;
}
if (Math.Abs(subtotalA - newSubtotalB) <= diff) {
return true;
}
if (Math.Abs(newSubtotalA - subtotalB) <= diff) {
return true;
}
if(!dic.ContainsKey(idx)) {
dic.Add(idx, new Dictionary<long, Dictionary<long, Dictionary<long, bool>>>());
}
if(!dic[idx].ContainsKey(subtotalA)) {
dic[idx].Add(subtotalA, new Dictionary<long, Dictionary<long, bool>>());
}
if(!dic[idx][subtotalA].ContainsKey(subtotalB)) {
dic[idx][subtotalA].Add(subtotalB, new Dictionary<long, bool>());
}
if(dic[idx][subtotalA][subtotalB].ContainsKey(diff)) {
return dic[idx][subtotalA][subtotalB][diff];
}
bool ans = false;
if(IsValid(idx + 1, subtotalA + this.ShinamonoList[idx].ValueA, subtotalB, diff)) {
ans = true;
}
else if( IsValid(idx + 1, subtotalA, subtotalB + this.ShinamonoList[idx].ValueB, diff)) {
ans = true;
}
dic[idx][subtotalA][subtotalB][diff] = ans;
return ans;
}
private List<Shinamono> ShinamonoList = new List<Shinamono>();
private class Shinamono {
public long ValueA;
public long ValueB;
public Shinamono(string init) {
long[] tmp = init.Split(' ').Select(a => long.Parse(a)).ToArray();
this.ValueA = tmp[0];
this.ValueB = tmp[1];
}
}
public class Reader
{
private static StringReader sr;
public static bool IsDebug = false;
public static string ReadLine()
{
if (IsDebug)
{
if (sr == null)
{
sr = new StringReader(InputText.Trim());
}
return sr.ReadLine();
}
else
{
return Console.ReadLine();
}
}
private static string InputText = @"
1
10 15
";
}
public static void Main(string[] args)
{
#if DEBUG
Reader.IsDebug = true;
#endif
Program prg = new Program();
prg.Proc();
}
}
14番