可以使用C#语言的在线ACM题库

发布时间:2017-09-04 12:11:57
可以使用C#语言的在线ACM题库


俄罗斯乌拉尔大学在线题库 是一个可以使用C#语言的在线ACM题库,有兴趣的朋友可以去试试。



Problem 1000. A+B Problem 是入门,就是简单地求整数 A 和 B 的和就行了,答案如下:



1 using System;

2

3 // ?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 // ?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 // ?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 // ?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 // ?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 //

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 //

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 }

72

73 int GetStart(int v, int min)

74 {

75 int v2 = v * v;

76 if (v2 >= min) return v2;

77 int x = min / v;

78 if ((x & 1) == 0) x++;

79 v2 = x * v;

80 if (v2 < min) v2 += v * 2;

81 return v2;

82 }

83

84 int[] GetPrimes(bool[] sieve, int min, int max)

85 {

86 int[] primes = new int[3401];

87 int i = 0;

88 for (int n = min; n <= max; n += 2) if (!sieve[(n - min) >> 1]) primes[i++] = n;

89 primes[i] = int.MaxValue;

90 return primes;

91 }

92

93 void OutPrimes(TextWriter writer, bool[] sieve, int min, int max, int min0, int max0)

94 {

95 if (min0 <= 2 && max0 >= 2) writer.WriteLine(2);

96 for (int n = min; n <= max; n += 2) if (!sieve[(n - min) >> 1]) writer.WriteLine(n);

97 writer.WriteLine();

98 }

99 }

100



Sphere Onlile Judge (SPOJ) 应该是使用 Linux 操作系统。目前使用的 C# 编译器是 mcs 1.0.1 (有点旧,目前最新版本是 1.9.1),C/C++ 编译器是 gcc 4.0.0-8 (也有点旧,目前最新版本是 4.3.1)。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网络营销 http://www.feimao666.com