poj3844水题,检查同于相同的数量即可,注意一下余数为零的情况,然后ans=西格玛c(2,n)

最近一直在搞java课程设计,一直在用java的ide,于是就悲剧了。。。

不停地TLE,时不时还来几次RE,于是我求助好友,看到他们c++的ac代码,和我差不多一样的,都过了。。。

import java.util.*;

public class Main {

    public static void main(String[] args) {
        //Scanner cin = new Scanner(System.in);

        Scanner cin = new Scanner(new BufferedInputStream(System.in));

        int a = cin.nextInt();
        for (int cas = 0; cas < a; ++cas) {

            int mod = cin.nextInt();
            int num = cin.nextInt();

            int[] sum = new int[num];


            sum[0]=cin.nextInt()%mod;
            for (int i = 1; i < num; ++i) {
                sum[i]=(sum[i-1]+cin.nextInt())%mod;
            }
            int[] count =new int[mod];
            count[0]=1;

            int ans = 0;
            for (int i = 0; i < sum.length; i++) {
                ans+=count[sum[i]];
                count[sum[i]]++;
            }

            System.out.println(ans);
        }

    }
}

这代码改成c++肯定过,可惜java超时了。

哎,人品不好

 

这里转发一篇《给JAVA同学刷OJ的建议》吧,以飨后人:

 

1. 如果时间或是空间很紧张,不要相信任何系统库。ArrayList, LinkedList, Hashtable, HashMap之类看起来很值得信任很好听的名字效率都低得可怜,不仅如此,还异常地消耗内存。这不是-O2下的vector,即便是std::map的效率都比HashMap高得多。唯一可以信赖的是数组,效率还过得去。

这里说一个小技巧,比如需要实现一个int->int的映射,可以先开一个数组,直接用mod定址,这是非常效率高的。在出现冲突时,再扔到一个HashMap里。一般来说,控制得好的话,HashMap里的总数应该不会达到总共的10%,然后整个时间和空间效率就基本可以满意了,也节约代码。

2. 语言特性和频繁地申请对象使Java不可避免地在效率上远落后于C/C++,但抛开效率,很多在C里会犯的低级错误都不会在Java里犯了,而且运行时抛出的异常有助于迅速检查代码。当测试过几个数据之后,再根据逻辑读一遍代码,就基本是通过了。通读程序很重要,有利于发现测试不易检查出的bug。

3. 如果有一个IDE将大大提高开发的效率,对于C或是C++来说,这种提高很有限,但Java的话则会很多。

4. regex效率尚可,乃一大利器,理论上说,Regional中(只要是Linux系统的Online Judge也可以)C/C++也是可以使用<regex.h>,但功能比java.util.regex里的少得多。

5. Java没有complex,给计算几何代码编写带来一些困难,但实现一个也不是非常困难。Math的功能尚可