ACM解题报告

ACM解题报告

 

 

结合实例加以总结:

 

1.         上大第二界程序设计大赛中的题A,大致的题意就是让你判断所给的状态是否是井字格游戏(XO表示2PLAYERX先走,“.”表示空白,即此格未被占据)。

这题说难不难,说简单却挺搞脑子的(ACM题的通性——搞脑子)。这道什么算法都没用到,之所以拿这道题开始是因为它有一个重要的启示在里面——思路的清晰。大部分人拿到题目一般都会一个IF-ELSE的往下写,最后写了一大堆还是WRONG ANSWER。这不奇怪,经过不少解题的经验,个人认为打草稿是必不可少的,将所有的情况都罗列出来,然后找共同点加以归类,使程序更清晰实用。

经过仔细观察,有五类情况下,输入的不是井字格游戏。

 

2.         第二个例子看看SHU-ACMONLINE上的1024题“服务顺序”。

Description

若干个顾客同时等待一项服务。顾客i需要的服务时间为ti。你的任务是安排n个顾客的服务次序使总的等待时间最小。总的等待时间是指每个顾客等待服务的时间的总和。

Input

从文本文件读入数据。该文件有若干测试数据,每组测试数据有两行,其第一行是一个整数n0<=n<=4000),表示本次测试中顾客的个数,其第二行是这n个顾客需要的服务时间为ti,前后两个顾客的t之间有一个空格。文件中各行的行首、行末无多余空格,输入文件中给出的顾客是按从小到大的顺序排列的。

Output

答案输出到输出文本文件中,该文件每一行是一个整数s,表示该次测试中n这些顾客最小的总等待时间。

Sample Input

3

4 6 2

5

5 4 3 2 1

Sample Output

8

20

 

这类题考的就是排序,这个例子还算简单,数据在4000以内,用一般的起泡排序或者STLSORT就可以解决问题了。因为要得到最小的等待时间,就要将服务时间从小到大排序,让服务时间最少的客户先接受服务,这样后面每个客户的等待时间都达到最小,最后再将所有客户的等待时间相加就可以得到总的最小等待服务时间了。

 

 

 

3.         SHU-ACMONLINE上的1020题“阶乘问题”。

Description

从输入文件中读取一个数n,求出n!中末尾0的个数。

Input

输入有若干行。每一行上有一个整数m,指明接下来的数字的个数。然后是m行,每一行包含一个确定的正整数n1

Output

对输入行中的每一个数据n,输出一行,其内容是n!中末尾0的个数。

Sample Input 3

3

100

1024

Sample Output

0

24

253

 

这道题是典型的先要用数学的思想去打草稿,把复杂简单化后再编程实现。一位位的去算这个阶乘是不现实的,因为最大的N10000000000,已经超出了计算机能接受的精度了,有什么简单的方法呢?n阶乘的含义就是1*2*3*……*n-1*n,经过观察,可以看到只有当其中某个数的末尾出现5的倍数时(0510152025…………)才可能在再结果中出现0,因此,这道题就可以简化为就n5的个数。从而可以得到我们非常简单的求解代码,如下:

 

#include

int main(){      int n,sum=0,a;

       scanf("%d",&n);

       while(n){ scanf("%d",&a);

                     for(;a!=0;){

                            sum += a/5;

                            a=a/5;}

       printf("%d/n",sum);

       sum=0;

       n--;

       }

}

你可能感兴趣的:(ACM解题报告)