您的位置:首页 > 编程语言 > C#

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

2008-06-07 20:43 363 查看
俄罗斯乌拉尔大学在线题库 是一个可以使用C#语言的在线ACM题库,有兴趣的朋友可以去试试。

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]));

}

}

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()

{

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

string[] nums = Regex.Split(Console.In.ReadToEnd().Trim(), @"\s+");

for (int i = nums.Length - 1; i >= 0; i--)

Console.WriteLine("{0:F4}", Math.Sqrt(ulong.Parse(nums[i])));

}

}

注意该程序的第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 {

new Acm1005().Run(Console.In, Console.Out);

}

void Run(TextReader reader, TextWriter writer)

{

writer.WriteLine(GetResult(GetWeigths(reader)));

}

int[] GetWeigths(TextReader reader)

{

string[] ss = Regex.Split(reader.ReadToEnd().Trim(), @"\s+");

int[] weigths = new int[int.Parse(ss[0])];

for (int i = 0; i < weigths.Length; i++) weigths[i] = int.Parse(ss[i + 1]);

return weigths;

}

int GetResult(int[] weigths)

{

int n = weigths.Length - 1;

int result = int.MaxValue;

int[] piles = new int[2];

for (int i = (1 << n) - 1; i >= 0; i--)

{

piles[0] = weigths[n];

piles[1] = 0;

for (int j = n - 1; j >= 0; j--) piles[(((i >> j) & 1) == 0) ? 1 : 0] += weigths[j];

int v = Math.Abs(piles[0] - piles[1]);

if (result > v) result = v;

}

return result;

}

}

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 }

static long Sum(long n)

{

if (n > 0) return n * (n + 1) / 2;

if (n < 0) return 1 + n * (1 - n) / 2;

return 1;

}

}

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);

}

void Run(TextReader reader, TextWriter writer)

{

double diff1 = GetDuration(reader);

double diff2 = GetDuration(reader);

writer.WriteLine(Math.Abs((int)Math.Round((diff1 - diff2) / 2)));

}

double GetDuration(TextReader reader)

{

string[] ss = reader.ReadLine().Split();

double diff = (GetTime(ss[1]) - GetTime(ss[0])).TotalHours;

if (diff > 6) diff -= 24;

if (diff < -6) diff += 24;

return diff;

}

DateTime GetTime(string s)

{

string[] ss = s.Split('.');

return new DateTime(1, 1, 1, int.Parse(ss[0]), int.Parse(ss[1]), 0);

}

}

其他的题目可能就没有这么容易了。 :)

根据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);

}

void Run(TextReader reader, TextWriter writer)

{

for (; ; )

{

string s = reader.ReadLine();

if (s == null) break;

if (s == "42") break;

writer.WriteLine(s);

}

}

}

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 }

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 }

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

俄罗斯乌拉尔大学在线题库 应该是使用 Windows 操作系统,估计是使用 C# 2.0 的编译器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐