poj3250 Bad Hair Day

 1 //超时代码
 2 #include<stdio.h>
 3 unsigned ans;
 4 int main()
 5 {
 6     int i,j,n,Q[80000];
 7     scanf("%d",&n);
 8     for(i=0;i<n;++i)
 9         scanf("%d",&Q[i]);
10     for(i=n-1;i>=0;--i){ //从后往前读 
11         for(j=i+1;j<n&&Q[i]>Q[j];++j); //从i处往后查找,直到碰到大于等于它的数为止 
12         ans+=j-i-1;  //把i后小于i的元素个数加到ans中 
13     }
14     printf("%lld\n",ans);
15     return 0;
16 }
 1 //AC代码 
 2 #include<stdio.h>
 3 unsigned ans;  //所求结果最大值为 3199960000,所以需要用无符号整型,其范围为0~4294967296 
 4 int main()
 5 {
 6     int i,k,n,a,Q[80000];  //定义一个堆栈,用来模拟单调堆栈,堆栈为从大到小排列 
 7     scanf("%d",&n);
 8     for(i=k=0;i<n;++i){
 9         scanf("%d",&a);
10         while(k>0&&Q[k]<=a)  //假如栈顶元素小于等于当前值,则退栈,否则入栈 
11             k--;
12         ans+=k;   //这里的K表示栈中元素个数,也即栈中大于a的元素个数 
13         Q[++k]=a; //该元素入栈 
14     }
15     printf("%lld\n",ans);//最后输出是需要“%lld”,因为这WA好几次 
16     return 0;
17 }

 

posted on 2012-08-06 18:00  小花熊  阅读(264)  评论(1编辑  收藏  举报

导航