Manor

Description

Bob有n个正整数,他将这n个整数根据大小划分成两部分。对于小于等于k的整数放在集合A中,其余的放在集合B中。每次他从集合B中取出一个最大的值,将其变成0放入A集合中。然后将A集合中所有的元素都增加a,如果此时A中元素大于k,那么要将该元素放入B中,同时将B集合中剩余的元素都增加b。Bob现在想知道经过m次操作后,B集合中元素的个数。

Input

有多组测试数据。

每组测试数据的第一行为4个整数n,k,a,b,n<=100000,k<=10^3,a,b<=100, 含义同上。接下的来的一行有n个数,表示这n个数的初始值(初始值小于等于200)。接下来的一行有一个整数q(q<=100),表示有q个询问。接下来有q行,每行一个正整数m(m<=200),表示第m次操作。

Output

对于每一个询问m,输出第m次操作前集合B中元素的个数

Sample Input

5 100 40 20
1000 250 300 10 25
10
1
2
3
4
5
6
7
8
9
10
4 100 10 10
105 150 25 75
4
1
2
3
4

Sample Output

3
2
2
3
3
3
3
3
3
3
2
1
0
1

#include<stdio.h>
#define maxn 100010

int n,m,a,b,q,i,j;
int seq[maxn],ans[222];

int main()
{
    while (scanf("%d%d%d%d",&n,&m,&a,&b)==4)
    {
        int mm = 0,pos=0,p;
        ans[0] = 0;
        for (i=1; i<=n; i++)
        {
            scanf("%d",&seq[i]);
            if (seq[i] > mm)
            {
                mm = seq[i];
                pos = i;
            }
            if (seq[i] > m) ans[0]++;
        }

        for (i=1; i<=200; i++)
        {
            if (mm > m) seq[pos] = 0;
            ans[i] = 0;
            mm = 0, pos = 0;
            for (j=1; j<=n; j++)
            {
                if (seq[j]<=m) seq[j] += a;
                else seq[j] += b;
                if (seq[j] > m) ans[i]++;
                if (seq[j] > mm)
                {
                    mm = seq[j];
                    pos = j;
                }
            }
        }
        scanf("%d",&q);
        while (q--)
        {
            scanf("%d",&p);
            printf("%d\n",ans[p-1]);
        }
    }
    return 0;
}
直接暴力模拟

 

posted @ 2013-09-05 09:55  1002liu  阅读(252)  评论(0编辑  收藏  举报