题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1029
这个题目有个坑的地方就是,java难以AC。
2017-11-27 19:30问题已解决:
因为N的值很大,java的输入输出比较慢。
我们通常使用的方式是过不了的,应该使用另一种方法。
具体方法看代码。
使用快排或者统计都超时了,但是同样的方法使用C语言就过了。
题意是给你n个数(n是奇数),将出现次数大于(n+1)/2的数输出。
这样的数显然就只有一个的,可以使用统计的方式。
#include <stdio.h>
#include <stdlib.h>int main()
{int n;//while(scanf("%d",&n)!=EOF)while(~scanf("%d",&n)){int appears[500000]= {0};int i,num,max;for(i = 0; i< n; i++){scanf("%d",&num);appears[num]++;if(appears[num]>=(n+1)/2){max = num;}}printf("%d\n",max);}return 0;
}
java AC代码:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer;public class Main{public static void main(String[] args) throws IOException {// 这句是io流包装,记住就好StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));//StreamTokenizer.TT_EOF这个是个参数,就是EOFwhile (in.nextToken() != StreamTokenizer.TT_EOF) {int n = (int) in.nval;int appears[] = new int[32768];// 记录出现次数int max = 0;for (int i = 0; i < n; i++) {in.nextToken();//指向下一个int num = (int) in.nval;//scanner.nextInt();appears[num]++;if (appears[num] >= (n + 1) / 2) {max = num;}}out.println(max);out.flush();//刷新,不然max会留在缓冲区}} }