当当网笔试的两道编程题
---恢复内容开始---
【一】
一共有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 }