Description:
Polycarp analyzes the prices of the new berPhone. At his disposal are the prices for n last days: a1,a2,…,an, where ai is the price of berPhone on the day i.
Polycarp considers the price on the day i to be bad if later (that is, a day with a greater number) berPhone was sold at a lower price. For example, if n=6 and a=[3,9,4,6,7,5], then the number of days with a bad price is 3 — these are days 2 (a2=9), 4 (a4=6) and 5 (a5=7).
Print the number of days with a bad price.
You have to answer t independent data sets.
Input:
The first line contains an integer t (1≤t≤10000) — the number of sets of input data in the test. Input data sets must be processed independently, one after another.
Each input data set consists of two lines. The first line contains an integer n (1≤n≤150000) — the number of days. The second line contains n integers a1,a2,…,an (1≤ai≤106), where ai is the price on the i-th day.
It is guaranteed that the sum of n over all data sets in the test does not exceed 150000.
Output:
Print t integers, the j-th of which should be equal to the number of days with a bad price in the j-th input data set.
(如你所见新人第一篇博客就是用来凑数的。各位大神见笑了)
题目大意:
有一个人,天天关注着一样商品的售价变化情况。得到统计数据后,如果某一天的价格,在今后的日子中存在比他更低的价格,那么称这个价格是“坏价格”(Bad Price)。
现给出t组统计数据,求每组数据中,有多少个“坏价格”。
题目抽象:
给定一数列a[],统计a[i]的数量,a[i]满足:存在a[i+n] < a[i](n>0)。
思考1:
这还不简单?对于每个a[i],遍历从i到最后一个a[],看是否存在a[j] < a[i].
但是,这种情况会超时。
思考2:
换个思路。顺序遍历,是从数列开始向结束“寻找”。需要反复运算许多次,非常浪费时间。
那为什么不从数列末端向开始“匹配”呢?
从数列末端开始,一个个向前匹配。不妨称我们当前已经遍历过的数字中,最小的值是”knownmin”(最开始是数列最后一项)。向数列开始方向匹配,如果一个数 大于 当下已知的最小值,那么 这个数,就应该是个“坏价格”。
如果一个数 小于 当下已知的最小值,那么 这个数,就不是“坏价格”。此时我们发现了一个更小的数,从这个数,也就是新的 已知最小值 出发,向数列末尾方向的数字,不受它的影响,是不是“坏价格”,由 先前的已知最小值 决定。而在这个 新的已知最小值,向数列开始方向的数字,如果大于 新的已知最小值,那么就是个“坏价格”。如果小于 新的已知最小值,那么重复上面的操作。
这么一来,只需要遍历一遍数列,就可以得到答案。
AC代码:
1 #include <stdio.h> 2 3 int main() 4 { 5 int q; 6 scanf("%d",&q); 7 int days,bads,knownmin,prices[150000]; 8 9 while (q--) 10 { 11 bads = 0; 12 scanf("%d",&days); 13 for (int i = 1; i <= days; i++) 14 { 15 scanf("%d",&prices[i]); 16 } 17 knownmin = prices[days]; 18 for (int i = days; i >= 0; i--) 19 { 20 if (prices[i]<=knownmin) 21 { 22 knownmin = prices[i]; 23 continue; 24 } 25 bads += 1; 26 } 27 printf("%d\n",bads); 28 } 29 return 0; 30 }