結果
問題 | No.1 道のショートカット |
ユーザー | clockln |
提出日時 | 2020-07-21 15:49:27 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 12,963 bytes |
コンパイル時間 | 960 ms |
コンパイル使用メモリ | 115,432 KB |
実行使用メモリ | 28,896 KB |
最終ジャッジ日時 | 2024-07-08 05:30:03 |
合計ジャッジ時間 | 3,551 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | WA | - |
testcase_02 | WA | - |
testcase_03 | AC | 27 ms
17,664 KB |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | AC | 27 ms
17,920 KB |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | AC | 27 ms
17,920 KB |
testcase_16 | WA | - |
testcase_17 | AC | 28 ms
17,792 KB |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
testcase_22 | WA | - |
testcase_23 | WA | - |
testcase_24 | WA | - |
testcase_25 | WA | - |
testcase_26 | WA | - |
testcase_27 | WA | - |
testcase_28 | WA | - |
testcase_29 | WA | - |
testcase_30 | WA | - |
testcase_31 | WA | - |
testcase_32 | WA | - |
testcase_33 | WA | - |
testcase_34 | WA | - |
testcase_35 | WA | - |
testcase_36 | WA | - |
testcase_37 | WA | - |
testcase_38 | WA | - |
testcase_39 | WA | - |
testcase_40 | WA | - |
testcase_41 | WA | - |
testcase_42 | WA | - |
testcase_43 | AC | 27 ms
17,664 KB |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.IO; using static System.Console; using static System.Math; public class Solve{ static public int mod = 1000000007; static public string al = "abcdefghijklmnopqrstuvwxyz"; public static void Main(){ // 方針 // var towns = rint(); var money = rint(); var roads = rint(); var pass = new List<List<int>>(); for(int i=0;i<towns;i++){ pass.Add(new List<int>()); } var si = inta(); var ti = inta(); var price = inta(); var time = inta(); for(int i=0;i<roads;i++){ pass[si[i]-1].Add(ti[i]-1); pass[si[i]-1].Add(price[i]); pass[si[i]-1].Add(time[i]); } var pq = new PriorityQueue3(); // 時間/金額/今の場所 pq.Enqueue(0,0,0); var min = mod; while(pq.Count() > 0){ var de = pq.Dequeue(); var nowtime = de[0]; var nowprice = de[1]; var nowplace = de[2]; if(min > nowtime) continue; for(int i=0;i<pass[nowplace].Count;i+=3){ var nt = pass[nowplace][i]; var np = pass[nowplace][i+1] + nowprice; var nti = pass[nowplace][i+2] + nowtime; if(np > money || nt > min) continue; if(nt == towns-1){ min = Min(min,nti); continue; } pq.Enqueue(nti,np,nt); } } if(min > 1000000000){ WriteLine(-1); }else{ WriteLine(min); } } public static void swap(ref int a,ref int b){int temp = a;a= b;b = temp;} static void charswap(ref char a,ref char b){char temp = a;a= b;b = temp;} static int ncr(int n,int r){if(n<r)return 0;r = Min(r,n-r);long nn = 1;for(int i=n-r+1;i<=n;i++){nn = nn*i%mod;}long rr = 1;for(int i=1;i<=r;i++){rr = rr*i%mod;}rr = square((int)rr,mod-2);nn = nn * rr %mod;return (int)nn;} // a^b mod static int square(int a,int b){string binary = Convert.ToString(b,2);int bileng = binary.Length;long a_power = a;long value = 1;for(int i=bileng-1;i>=0;i--){if(binary[i] == '1'){value = value*a_power%mod;}a_power = a_power*a_power%mod;}return (int)value;} static int square2(int a,int b){long output = 1;var list = new List<long>();int sh = 1;long n = a;list.Add(a);while(sh < b){sh *= 2;n = n*n%mod;list.Add(n);}for(int i=list.Count-1;i>=0;i--){if(b > sh){b -= sh;sh /= 2;output = output*list[i]%mod;}}return (int)output;} //各種読取 static string rstr(){ return ReadLine(); } static int rint(){ return int.Parse(ReadLine()); } static long rlong(){ return long.Parse(ReadLine()); } static string[] stra(){ return ReadLine().Split(' '); } static char[] chara(){ string[] a=stra();string b="";for(int i=0;i<a.Length;i++){b+=a[i];}return b.ToCharArray();} static int[] inta(){ string[] read_str_array = ReadLine().Split(' '); int[] return_int_array = new int[read_str_array.Length]; for(int countup_i=0;countup_i<read_str_array.Length;countup_i++){ return_int_array[countup_i] = int.Parse(read_str_array[countup_i]); } return return_int_array; } static int[,] inta2(int num_array,int in_array){ int[,] int_array2 = new int[num_array,in_array]; for(int i=0;i<num_array;i++){ int[] temp_array = inta(); for(int j=0;j<in_array;j++){ int_array2[i,j] = temp_array[j]; } } return int_array2; } static long[] longa(){ string[] read_str_array = ReadLine().Split(' '); long[] return_long_array = new long[read_str_array.Length]; for(long countup_i=0;countup_i<read_str_array.Length;countup_i++){ return_long_array[countup_i] = long.Parse(read_str_array[countup_i]); } return return_long_array; } static double[] doublea(){ string[] read_str_array = ReadLine().Split(' '); double[] return_double_array = new double[read_str_array.Length]; for(long countup_i=0;countup_i<read_str_array.Length;countup_i++){ return_double_array[countup_i] = double.Parse(read_str_array[countup_i]); } return return_double_array; } // ----------------------------- static long GCD(long a,long b){ if(a < b){ long temp = a; a = b; b = temp; } if(a % b == 0){ return b; } else{ long temp = b; b = a%b; a = temp; return GCD(a,b); } } static long LCM(long a,long b){ return a * b / GCD(a,b); } static void WriteArray(int[,] a,int b,int c){for(int i=0;i<b;i++){for(int j=0;j<c;j++){if(j!=0) Write(" ");Write(a[i,j]);}WriteLine();}} } class UnionFind{ private int[] _unionfind; private int[] _unionfind_size; public UnionFind(int a){ _unionfind = new int[a]; _unionfind_size = new int[a]; for(int i=0;i<a;i++){ _unionfind[i] = i; _unionfind_size[i] = 1; } } public int Root(int x){ if(_unionfind[x] == x) return x; return _unionfind[x] = Root(_unionfind[x]); } public void Unite(int a,int b){ a = Root(a); b = Root(b); if(a == b) return; if(_unionfind_size[a] < _unionfind_size[b]){ int temp = a; a = b; b = temp; } _unionfind[b] = a; _unionfind_size[a] += _unionfind_size[b]; } public bool Same(int a,int b){ return Root(a) == Root(b); } public int Size(int x){ return _unionfind_size[Root(x)]; } } class PriorityQueue{ private List<int> _priorityqueue = new List<int>(); public void Enqueue(int a){ _priorityqueue.Add(a); int num = _priorityqueue.Count-1; while(true){ if(num == 0) break; if(_priorityqueue[(num-1)/2] < _priorityqueue[num]){ //大小逆の時弄るとこ int temp = _priorityqueue[(num-1)/2]; _priorityqueue[(num-1)/2] = _priorityqueue[num]; _priorityqueue[num] = temp; num = (num-1)/2; }else{ break; } } } public int Dequeue(){ int re = _priorityqueue[0]; int temp = _priorityqueue[0]; _priorityqueue[0] = _priorityqueue[_priorityqueue.Count-1]; _priorityqueue[_priorityqueue.Count-1] = temp; _priorityqueue.RemoveAt(_priorityqueue.Count-1); int num = 0; while(true){ int swapnum = -1; if((num+1)*2 < _priorityqueue.Count){ if(_priorityqueue[num*2+1] > _priorityqueue[(num+1)*2]){ //大小逆の時弄るとこ swapnum = num*2+1; }else{ swapnum = (num+1)*2; } }else if(num*2+1 < _priorityqueue.Count){ swapnum = num*2+1; } if(swapnum == -1) break; if(_priorityqueue[swapnum] > _priorityqueue[num]){ //大小逆の時弄るとこ temp = _priorityqueue[swapnum]; _priorityqueue[swapnum] = _priorityqueue[num]; _priorityqueue[num] = temp; num = swapnum; }else{ break; } } return re; } public int Peek(){ return _priorityqueue[0]; } public int Count(){ return _priorityqueue.Count; } } class PriorityQueue2{ private List<int> _priorityqueue = new List<int>(); private List<int> _accompany_info = new List<int>(); public void Enqueue(int a,int b){ _priorityqueue.Add(a); _accompany_info.Add(b); int num = _priorityqueue.Count-1; while(true){ if(num == 0) break; if(_priorityqueue[(num-1)/2] > _priorityqueue[num]){ //大小逆の時弄るとこ int temp = _priorityqueue[(num-1)/2]; _priorityqueue[(num-1)/2] = _priorityqueue[num]; _priorityqueue[num] = temp; temp = _accompany_info[(num-1)/2]; _accompany_info[(num-1)/2] = _accompany_info[num]; _accompany_info[num] = temp; num = (num-1)/2; }else{ break; } } } public int[] Dequeue(){ var re = new int[]{_priorityqueue[0],_accompany_info[0]}; var qcount = _priorityqueue.Count; var temp = _priorityqueue[0]; _priorityqueue[0] = _priorityqueue[qcount-1]; _priorityqueue[qcount-1] = temp; temp = _accompany_info[0]; _accompany_info[0] = _accompany_info[qcount-1]; _accompany_info[qcount-1] = temp; _priorityqueue.RemoveAt(qcount-1); _accompany_info.RemoveAt(qcount-1); int num = 0; while(true){ int swapnum = -1; if((num+1)*2 < _priorityqueue.Count){ if(_priorityqueue[num*2+1] < _priorityqueue[(num+1)*2]){ //大小逆の時弄るとこ swapnum = num*2+1; }else{ swapnum = (num+1)*2; } }else if(num*2+1 < _priorityqueue.Count){ swapnum = num*2+1; } if(swapnum == -1) break; if(_priorityqueue[swapnum] < _priorityqueue[num]){ //大小逆の時弄るとこ temp = _priorityqueue[swapnum];_priorityqueue[swapnum] = _priorityqueue[num];_priorityqueue[num] = temp; temp = _accompany_info[swapnum];_accompany_info[swapnum] = _accompany_info[num];_accompany_info[num] = temp; num = swapnum; }else{ break; } } return re; } public int[] Peek(){ var temp = new int[]{_priorityqueue[0],_accompany_info[0]}; return temp; } public int Count(){ return _priorityqueue.Count; } } class PriorityQueue3{ private List<int> _priorityqueue = new List<int>(); private List<int> _accompany_info = new List<int>(); private List<int> _accompany_info2 = new List<int>(); public void Enqueue(int a,int b,int c){ _priorityqueue.Add(a); _accompany_info.Add(b); _accompany_info2.Add(c); int num = _priorityqueue.Count-1; while(true){ if(num == 0) break; if(_priorityqueue[(num-1)/2] > _priorityqueue[num]){ //大小逆の時弄るとこ int temp = _priorityqueue[(num-1)/2]; _priorityqueue[(num-1)/2] = _priorityqueue[num]; _priorityqueue[num] = temp; temp = _accompany_info[(num-1)/2]; _accompany_info[(num-1)/2] = _accompany_info[num]; _accompany_info[num] = temp; temp = _accompany_info2[(num-1)/2]; _accompany_info2[(num-1)/2] = _accompany_info2[num]; _accompany_info2[num] = temp; num = (num-1)/2; }else{ break; } } } public int[] Dequeue(){ var re = new int[]{_priorityqueue[0],_accompany_info[0],_accompany_info2[0]}; var qcount = _priorityqueue.Count; var temp = _priorityqueue[0]; _priorityqueue[0] = _priorityqueue[qcount-1]; _priorityqueue[qcount-1] = temp; temp = _accompany_info[0]; _accompany_info[0] = _accompany_info[qcount-1]; _accompany_info[qcount-1] = temp; temp = _accompany_info2[0]; _accompany_info2[0] = _accompany_info2[qcount-1]; _accompany_info2[qcount-1] = temp; _priorityqueue.RemoveAt(qcount-1); _accompany_info.RemoveAt(qcount-1); _accompany_info2.RemoveAt(qcount-1); int num = 0; while(true){ int swapnum = -1; if((num+1)*2 < _priorityqueue.Count){ if(_priorityqueue[num*2+1] < _priorityqueue[(num+1)*2]){ //大小逆の時弄るとこ swapnum = num*2+1; }else{ swapnum = (num+1)*2; } }else if(num*2+1 < _priorityqueue.Count){ swapnum = num*2+1; } if(swapnum == -1) break; if(_priorityqueue[swapnum] < _priorityqueue[num]){ //大小逆の時弄るとこ temp = _priorityqueue[swapnum];_priorityqueue[swapnum] = _priorityqueue[num];_priorityqueue[num] = temp; temp = _accompany_info[swapnum];_accompany_info[swapnum] = _accompany_info[num];_accompany_info[num] = temp; temp = _accompany_info2[swapnum];_accompany_info2[swapnum] = _accompany_info2[num];_accompany_info2[num] = temp; num = swapnum; }else{ break; } } return re; } public int[] Peek(){ var temp = new int[]{_priorityqueue[0],_accompany_info[0],_accompany_info2[0]}; return temp; } public int Count(){ return _priorityqueue.Count; } }