在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Problem 1000. A+B Problem 是入门,就是简单地求整数 A 和 B 的和就行了,答案如下:
1 using System;
2 3 // http://acm.timus.ru/problem.aspx?space=1&num=1000 4 class Acm1000 5 { 6 static void Main() 7 { 8 string[] ss = Console.ReadLine().Split(); 9 Console.WriteLine(long.Parse(ss[0]) + long.Parse(ss[1])); 10 } 11 } 12 Problem 1001. Reverse root 也很简单,就是给出一组整数,然后反序输出其平方根就行了,答案如下:
1 using System;
2 using System.Threading; 3 using System.Globalization; 4 using System.Text.RegularExpressions; 5 6 // http://acm.timus.ru/problem.aspx?space=1&num=1001 7 class Acm1001 8 { 9 static void Main() 10 { 11 Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; 12 string[] nums = Regex.Split(Console.In.ReadToEnd().Trim(), @"\s+"); 13 for (int i = nums.Length - 1; i >= 0; i--) 14 Console.WriteLine("{0:F4}", Math.Sqrt(ulong.Parse(nums[i]))); 15 } 16 } 17 注意该程序的第11行不可省略,不然就无法通过。目前还不知道是什么原因(已经找到原因了,请参见2楼的评论)。 Problem 1005. Stone pile 要求将若干石头分为两堆使其重量差最小,答案如下:
1 using System;
2 using System.IO; 3 using System.Text.RegularExpressions; 4 5 // http://acm.timus.ru/problem.aspx?space=1&num=1005 6 class Acm1005 7 { 8 static void Main() 9 { 10 new Acm1005().Run(Console.In, Console.Out); 11 } 12 13 void Run(TextReader reader, TextWriter writer) 14 { 15 writer.WriteLine(GetResult(GetWeigths(reader))); 16 } 17 18 int[] GetWeigths(TextReader reader) 19 { 20 string[] ss = Regex.Split(reader.ReadToEnd().Trim(), @"\s+"); 21 int[] weigths = new int[int.Parse(ss[0])]; 22 for (int i = 0; i < weigths.Length; i++) weigths[i] = int.Parse(ss[i + 1]); 23 return weigths; 24 } 25 26 int GetResult(int[] weigths) 27 { 28 int n = weigths.Length - 1; 29 int result = int.MaxValue; 30 int[] piles = new int[2]; 31 for (int i = (1 << n) - 1; i >= 0; i--) 32 { 33 piles[0] = weigths[n]; 34 piles[1] = 0; 35 for (int j = n - 1; j >= 0; j--) piles[(((i >> j) & 1) == 0) ? 1 : 0] += weigths[j]; 36 int v = Math.Abs(piles[0] - piles[1]); 37 if (result > v) result = v; 38 } 39 return result; 40 } 41 } 42 Problem 1068. Sum 也很简单,就是求 1 到 N 的和,答案如下:
1 using System;
2 3 // http://acm.timus.ru/problem.aspx?space=1&num=1068 4 class Acm1068 5 { 6 static void Main() 7 { 8 Console.WriteLine(Sum(int.Parse(Console.ReadLine()))); 9 } 10 11 static long Sum(long n) 12 { 13 if (n > 0) return n * (n + 1) / 2; 14 if (n < 0) return 1 + n * (1 - n) / 2; 15 return 1; 16 } 17 } 18 Problem 1070. A local time 要求根据两地间的往返航班的起降时刻(用本地时间表示)来计算这两地间的时差,答案如下:
1 using System;
2 using System.IO; 3 4 // http://acm.timus.ru/problem.aspx?space=1&num=1070 5 class Acm1070 6 { 7 static void Main() 8 { 9 new Acm1070().Run(Console.In, Console.Out); 10 } 11 12 void Run(TextReader reader, TextWriter writer) 13 { 14 double diff1 = GetDuration(reader); 15 double diff2 = GetDuration(reader); 16 writer.WriteLine(Math.Abs((int)Math.Round((diff1 - diff2) / 2))); 17 } 18 19 double GetDuration(TextReader reader) 20 { 21 string[] ss = reader.ReadLine().Split(); 22 double diff = (GetTime(ss[1]) - GetTime(ss[0])).TotalHours; 23 if (diff > 6) diff -= 24; 24 if (diff < -6) diff += 24; 25 return diff; 26 } 27 28 DateTime GetTime(string s) 29 { 30 string[] ss = s.Split('.'); 31 return new DateTime(1, 1, 1, int.Parse(ss[0]), int.Parse(ss[1]), 0); 32 } 33 } 34 其他的题目可能就没有这么容易了。 :) 根据8楼 CppGohan 朋友的评论,Sphere Onlile Judge (SPOJ) 也是一个支持C#语言的在线ACM题库。 1. Life, the Universe, and Everything 是入门,就是一行一行地将标准输入原样复制到标准输出直到遇到一行为“42”为止,答案如下:
1 using System;
2 using System.IO; 3 4 // http://www.spoj.pl/problems/TEST/ 5 class S1 6 { 7 static void Main() 8 { 9 new S1().Run(Console.In, Console.Out); 10 } 11 12 void Run(TextReader reader, TextWriter writer) 13 { 14 for (; ; ) 15 { 16 string s = reader.ReadLine(); 17 if (s == null) break; 18 if (s == "42") break; 19 writer.WriteLine(s); 20 } 21 } 22 } 23 2. Prime Generator 要求生成多组指定范围的素数,答案如下:
1 using System; 2 using System.IO; 3 4 // http://www.spoj.pl/problems/PRIME1/ 5 class S2 6 { 7 struct Range 8 { 9 public int Min; 10 public int Max; 11 } 12 13 static void Main() 14 { 15 new S2().Run(Console.In, Console.Out); 16 } 17 18 void Run(TextReader reader, TextWriter writer) 19 { 20 int theMax; 21 Range[] ranges = GetRanges(reader, out theMax); 22 int min = 3; 23 int max = (int)Math.Sqrt(theMax) + 1; 24 if ((max & 1) == 0) max--; 25 int[] primes = GetPrimes(GetSieve(min, max), min, max); 26 foreach (Range range in ranges) 27 { 28 min = range.Min; 29 max = range.Max; 30 if (min == 1) min = 3; 31 if ((min & 1) == 0) min++; 32 if ((max & 1) == 0) max--; 33 OutPrimes(writer, GetSieve(primes, min, max), min, max, range.Min, range.Max); 34 } 35 } 36 37 Range[] GetRanges(TextReader reader, out int max) 38 { 39 max = 0; 40 Range[] ranges = new Range[int.Parse(reader.ReadLine())]; 41 for (int i = 0; i < ranges.Length; i++) 42 { 43 string[] ss = reader.ReadLine().Split(); 44 ranges[i].Min = int.Parse(ss[0]); 45 ranges[i].Max = int.Parse(ss[1]); 46 if (max < ranges[i].Max) max = ranges[i].Max; 47 } 48 return ranges; 49 } 50 51 bool[] GetSieve(int min, int max) 52 { 53 bool[] sieve = new bool[((max - min) >> 1) + 1]; 54 int sqrt = (int)Math.Sqrt(max) + 1; 55 for (int n = min; n <= sqrt; n += 2) if (!sieve[(n - min) >> 1]) SetSieve(sieve, n, min, max); 56 return sieve; 57 } 58 59 bool[] GetSieve(int[] primes, int min, int max) 60 { 61 bool[] sieve = new bool[((max - min) >> 1) + 1]; 62 int sqrt = (int)Math.Sqrt(max) + 1; 63 for (int i = 0; primes[i] <= sqrt; i++) SetSieve(sieve, primes[i], min, max); 64 return sieve; 65 } 66 67 void SetSieve(bool[] sieve, int v, int min, int max) 68 { 69 int step = v << 1; 70 for (int n = GetStart(v, min); n <= max; n += step) sieve[(n - min) >> 1] = true; 71 } |
请发表评论