当当网笔试的两道编程题

---恢复内容开始---

【一】

一共有n个人,有m条跳绳,我们如何分配组以及组员数,使得每组的人数相差最少,例如输入9个人,8条跳绳,最佳分配是5,4;


刚开始并没有理解题的意思,情急之下,百度为上。看到一道和这道题非常类似的题目。

输入两个数,人数为n,跳绳数为m。

首先,加入人数小于m分成1组就好了,如果大于m,分组数groups=(n+m-1)/m.其实就是除法然后进1法,例如当我们有25个人,8条跳绳(25÷8等于3余1,进一法为4)的时候,应该分组为:7、6、6、6

如果groups>m的话,直接令groups=m;

int num = n /g;      // 每组人数(g-1)个num       

 int r = n%g;        // 分组 余 数 r      

for(int i=0;i<r;i++)

{    // 余数均 分         

System.out.println(num+1);      

}       

for(int i=0;i<g-r; i++){  // 输出剩下的            

System.out.println(num); }    

 

 

 

【二】

左手右手轮流搭积木,哪只手开始必须那只手结束,问有多少搭积木的方案?例如5个积木,有4个搭积木的方案,11111,212,122,221

首先,我们可以看出来,只有奇数步数的方案走得通,因为要哪只手开始哪只手结束。

 1 #include <string>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 
 7 int test2(int n, int step) {
 8     if (n == 0 && (step & 1)) return 0;
 9     if (n == 0 && !(step & 1)) return 1;
10     if (n == 1 && (step & 1)) return 1;
11     if (n == 1 && !(step & 1)) return 0;
12     return test2(n - 1, step + 1) + test2(n - 2, step + 1);
13 
14 }
15 
16 void test1() {
17     int n, res;
18     cin >> n;
19     res = test2(n, 0);
20     cout << res;
21 }
22 
23 
24 int main()
25 {
26     test1();
27     return 0;
28 }

 

posted @ 2015-11-16 13:07  0giant  阅读(528)  评论(0编辑  收藏  举报