发布于 2014-10-17 07:43:30 | 296 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的精品教程,程序狗速度看过来!

大众点评网

大众点评网于2003年4月成立于上海。大众点评是中国领先的本地生活信息及交易平台,也是全球最早建立的独立第三方消费点评网站。大众点评不仅为用户提 供商户信息、消费点评及消费优惠等信息服务,同时亦提供团购、餐厅预订、外卖及电子会员卡等O2O(Online To Offline)交易服务。大众点评是国内最早开发本地生活移动应用的企业,目前已成长为一家移动互联网公司,大众点评移动客户端已成为本地生活必备工具。


问题1:

这是一道动态规划的问题,状态转移方程为
dp[i] = dp[i-3] + dp[i-1] , i>= 3(i<3时dp[i]=1,只有1种情况)
我这里直接开了一个dp数组解决这个问题。在init方法中进行了初始化。
另外,考虑到为了方便测试,我用了一个递归函数dfs(m,n,str)来进行对所有情况的输出。具体见代码:dfs函数的功能就是输出所有的可行方案。
如:当我输入5的时候,输出:
4
所有方案:
11111
211
121
112
同时我设定了数n的范围,当n<0时或n大于我设定的范围时,会提示出错。
下面是C++代码:

 

    #include <cstdio>  
    #include <cstring>  
    #include <iostream>  
    #include <algorithm>  
    #include <string>  
    using namespace std;  
    const int maxn = 1010;  
    int dp[maxn];  
    void init() {  
        dp[0] = dp[1] = dp[2] = 1;  
        for(int i=3;i<maxn;i++) dp[i] = dp[i-1] + dp[i-3];  
    }  
    void dfs(int m,int n,string str) {  
        if(m == 0) {  
            cout << str << endl;  
            return;  
        }  
        if(m >= 1)  
            dfs(m-1 , n , "1"+str);  
        if(m >= 3)  
            dfs(m-3 , n , "2"+str);  
        return;  
    }  
    int main() {  
        int n;  
        init();  
        while(scanf("%d" , &n) != EOF) {  
            if(n < 0) {  
                puts("这段路的长度不能为负数!\n");  
                continue;  
            }  
            if(n >= 1010) {  
                puts("我这里设定的最大长度是1009,如果需要改变长度,请联系相关人员!");  
                continue;  
            }  
            int ans = dp[n];  
            printf("%d\n" , ans);  
            printf("所有方案:\n");  
            dfs(n , n , "");  
        }  
        return 0;  
    } 


问题2:

首先通过代码得到二进制数:

    #include <cstdio>  
    #include <cstring>  
    #include <iostream>  
    #include <algorithm>  
    using namespace std;  
    void get(int n) {  
        if(n == 0) return;  
        get(n/2);printf("%d" , n%2);  
    }  
    int main() {  
        get(3593);  
        return 0;  
    } 


1)至少需要开12个线程。
首先我把3593表示成二进制数,为111000001001,一共有12位,然后我开十二个进程,第i个进程中包含所有二进制表示中第i位为0的用户的 集合,如果算法能够检测到违规用户,那么违规用户的第i位二进制数就是0,否则为1.这样开12个线程就能得到第i位用户的所有二进制位的数字,以此得到 该违规用户的数字。

2)至少需要开6个。
第一秒先判断3593的前6个二进制位;
第二秒判断3593的后6个二进制位。
方法同1)。

注:2)的解答不一定对。



最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务