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

俄罗斯乌拉尔大学在线题库  是一个可以使用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 ]));
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    }
 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)。

你可能感兴趣的:(可以使用C#语言的在线ACM题库)