hdu 4006 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4006

大连网络赛过得人最多的题 难点在于排序超时 (n k都很大)感谢海峰学长讲述的不排序的排序算法(用空间换时间)

①输入 第一个数 m,令ans=m

②输入前k个数 若输入的数<ans 令ans=输入的数

③输入后面的行 若Q 输出ans 若输入的数大于或等于ans ans向后跳一个数 否则ans不动

 一二过程中place=1;

三过程中先跳place若place>f[ans] 则让ans跳到int数组的下一个不为0处 place=1;

 代码如下

 1 #include<iostream>
2 #include<cstdio>
3 using namespace std;
4 int f[1000000]={0};
5 int main()
6 {
7
8 int ncase,kmax,i,j,k,place=1,ans,temp;
9 char ch;
10 while(scanf("%d %d",&ncase,&kmax)!=EOF)
11 {
12 getchar();
13 memset(f,0,sizeof(f));
14 place=1;
15 scanf("%c %d",&ch,&ans);
16 getchar();
17 f[ans]++;
18 for(i=2;i<=kmax;i++)
19 {
20 scanf("%c %d",&ch,&temp);
21 getchar();
22 f[temp]++;
23 if(ans>temp)
24 ans=temp;
25 }
26 for(i=kmax+1;i<=ncase;i++)
27 {
28 scanf("%c",&ch);
29 getchar();
30 if(ch=='Q')
31 {printf("%d\n",ans);}
32 else
33 {
34 scanf("%d",&temp);
35 getchar();
36 f[temp]++;
37 if(temp>=ans)
38 {
39 place++;
40 if( place>f[ans])
41 {
42 for(j=ans+1;j<=100000;j++)
43 {
44 if(f[j]>0)
45 {
46 ans=j;
47 place=1;
48 break;
49 }
50 }
51 }
52 }
53 }
54 }
55 }
56 //system("pause");
57 return 0;
58 }

 

 

posted on 2011-09-05 12:14  渔家傲  阅读(303)  评论(0编辑  收藏  举报

导航