网易2017内推笔试题目

http://www.nowcoder.com/discuss/6959?type=3&order=0&pos=2&page=1

[编程题] 幸运的袋子
一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。
例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。 
输入描述:
第一行输入一个正整数n(n ≤ 1000)
第二行为n个数正整数xi(xi ≤ 1000)


输出描述:
输出可以产生的幸运的袋子数

输入例子:
3
1 1 1

输出例子:
2


#include 
#include 
#include 
using namespace std;


int dfs( int i, int s, int p, vector<int> &data, int nxt[], int n )
{
    if( i >= n )    
    {
        return s > p;
    }

    if( data[i] > 1 && s < p )
    {
        return 0;   
    }

    return dfs( i + 1, s + data[i], p * data[i], data, nxt, n ) + dfs( nxt[i], s, p, data, nxt, n );

}



int main()
{
    int ret = 0;
    const int NUM = 1001;
    int n = 0;

    int nxt[NUM];

    while( cin >> n )
    {
        vector<int> data( n, 0 );

        for( int i = 0; i < n; i++ )
        {
            cin >> data[i];    
        }

        sort( data.begin(), data.end() );

        int pos = n;

        for( int i = n - 1; i >= 0 ; i-- )
        {
            if( i < n - 1 && data[i] < data[ i + 1 ] )      
            {
                pos = i + 1;
            }

            nxt[i] = pos;
        }

        cout << dfs( 0, 0, 1, data, nxt, n ) << endl;

    }

    return ret;
}


[编程题] 饥饿的小易
小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃。最开始小易在一个初始位置x_0。对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7。因为使用神秘力量要耗费太多体力,所以它只能使用神秘力量最多100,000次。贝壳总生长在能被1,000,000,007整除的位置(比如:位置0,位置1,000,000,007,位置2,000,000,014等)。小易需要你帮忙计算最少需要使用多少次神秘力量就能吃到贝壳。 
输入描述:
输入一个初始位置x_0,范围在11,000,000,006


输出描述:
输出小易最少需要使用神秘力量的次数,如果使用次数使用完还没找到贝壳,则输出-1

输入例子:
125000000

输出例子:
1


#include 
#include 
#include 
#include 
#include 
using namespace std;


int main()
{
    int ret = 0;

    unsigned long long  x0 = 0;
    unsigned long long  NUM0 = 1000000007;

    while( cin >> x0 )
    {
        queue<unsigned long long > qu;
        map<unsigned long long , int > mp;
        qu.push(x0);
        mp[x0] = 0;
        unsigned long long  num = qu.front();

        while( !qu.empty() )
        {
            num = qu.front();
            qu.pop();
            int cnt = mp[num];

            if( 0 == num )
            {
                //cout << cnt << endl;
                break;
            }

            if( cnt > 100000 )
            {
                continue;
            }

            unsigned long long v1 = ( num  * 4 + 3 )  % NUM0;

            if( mp.find(v1) == mp.end() )
            {
                mp[v1] = cnt + 1;
                qu.push(v1);
            }

            unsigned long long  v2 = ( num  * 8 + 7 )  % NUM0;

            if( mp.find(v2) == mp.end() )
            {
                mp[v2] = cnt + 1;
                qu.push(v2);
            }

        }

        printf("%d\n",mp[0] ? mp[0] : -1 ); 

    }

    return ret;

}



你可能感兴趣的:(goodCode)