【编程题】好多鱼!--大鱼吃小鱼问题
2017-04-06 23:27
483 查看
牛牛有一个鱼缸。鱼缸里面已经有n条鱼,每条鱼的大小为fishSize[i] (1 ≤ i ≤ n,均为正整数),牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸内存在着大鱼吃小鱼的定律。经过观察,牛牛发现一条鱼A的大小为另外一条鱼B大小的2倍到10倍(包括2倍大小和10倍大小),鱼A会吃掉鱼B。考虑到这个,牛牛要放入的鱼就需要保证:
1、放进去的鱼是安全的,不会被其他鱼吃掉
2、这条鱼放进去也不能吃掉其他鱼
鱼缸里面已经存在的鱼已经相处了很久,不考虑他们互相捕食。现在知道新放入鱼的大小范围minSize,maxSize(考虑鱼的大小都是整数表示),牛牛想知道有多少种大小的鱼可以放入这个鱼缸。
输入描述:
输入数据包括3行. 第一行为新放入鱼的尺寸范围minSize,maxSize(1 ≤ minSize,maxSize ≤
1000),以空格分隔。 第二行为鱼缸里面已经有鱼的数量n(1 ≤ n ≤ 50) 第三行为已经有的鱼的大小fishSize[i](1 ≤
fishSize[i] ≤ 1000),以空格分隔。
输出描述:
输出有多少种大小的鱼可以放入这个鱼缸。考虑鱼的大小都是整数表示
输入例子:
1 12
1
1
输出例子:
3
1、放进去的鱼是安全的,不会被其他鱼吃掉
2、这条鱼放进去也不能吃掉其他鱼
鱼缸里面已经存在的鱼已经相处了很久,不考虑他们互相捕食。现在知道新放入鱼的大小范围minSize,maxSize(考虑鱼的大小都是整数表示),牛牛想知道有多少种大小的鱼可以放入这个鱼缸。
输入描述:
输入数据包括3行. 第一行为新放入鱼的尺寸范围minSize,maxSize(1 ≤ minSize,maxSize ≤
1000),以空格分隔。 第二行为鱼缸里面已经有鱼的数量n(1 ≤ n ≤ 50) 第三行为已经有的鱼的大小fishSize[i](1 ≤
fishSize[i] ≤ 1000),以空格分隔。
输出描述:
输出有多少种大小的鱼可以放入这个鱼缸。考虑鱼的大小都是整数表示
输入例子:
1 12
1
1
输出例子:
3
题目分析
我们可以申请一个长度1001的布尔类型数组denial,数组下标为新放入鱼的大小,数组中存放该下标大小的鱼是否可以放到鱼缸里(false表示可以放,true表示不能放)我们只需要把不可以放鱼的位置标记起来,就可以通过遍历数组得到可放位置的数量。 然后,我们可以把问题分成两部分 1.新放入的鱼不能被其他鱼吃掉,即fishSize*2 到 fishSize*10 不可以放鱼(fishSize是已存在鱼的大小) ==>X >= 2*fishSize && X <= 10*fishSize 为不可放鱼的区域 2.新放入的鱼(X)不能吃其他鱼,即fishSize不在X*2到X*10范围内 ==>fishSize < 2*X || fishSize > 10*X ==> X >= fishSize/10.0 && X <= fishSize/2 为不可放鱼的区域 因为鱼大小都是整数,最大边界 fishSize/2向下取整,整形除法自动完成, 最小边界fishSize/10.0 要向上取整(用ceil)。 3.X要满足在minSize和maxSize之间,要在上面两个问题中加入条件
代码
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cmath> using namespace std; int main() { int minSize = 0; int maxSize = 0; int num = 0; int fishsize = 0; int count = 0; bool denial[1001] = { false }; cin >> minSize >> maxSize >> num; for (int idx = 1; idx <= num; idx++) { cin >> fishsize; if (fishsize >= 1 && fishsize <= 1000) { //情况1:标记会被已存在鱼吃掉的位置 for (int denIdx = 2 * fishsize; denIdx <= maxSize && denIdx <= 10 * fishsize; denIdx++) denial[denIdx] = true; //情况2:标记会吃掉已存在鱼的位置 for (int denIdx = fishsize / 2; denIdx >= minSize && denIdx >= ceil(fishsize / 10.0); denIdx--) denial[denIdx] = true; } else//鱼大小不符合标准 { cout << "input error" << endl; return -1; } } //统计没有被标记的位置的数量 for (int i = minSize; i <= maxSize; i++) { if (!denial[i]) count++; } cout << count; return 0; }
相关文章推荐
- 51nod大鱼吃小鱼问题
- 2011存储:大鱼与小鱼的博弈 推荐
- 大鱼与小鱼(转)
- 大鱼吃小鱼 tzc
- 很有趣的一道编程题,子弹分发问题
- 上机编程题-迷宫问题
- C/C++编程题 约瑟夫环问题分析
- cocos2d-x学习(10)----大鱼吃小鱼(二)
- 蓝桥杯 2014年javaB组 编程题 分糖果问题
- 很有趣的一道编程题,子弹分发问题
- 大鱼和小鱼的故事
- 这个社会最大的现实是“大鱼吃小鱼,小鱼吃虾米”
- 技术的“零和”博弈:大鱼吃小鱼
- 0/1背包问题(一道编程题)
- 互联网大鱼吃小鱼背后:十亿消费者的推崇
- 大鱼吃小鱼
- 解决了wanda小鱼的中文乱码问题
- 渔夫与大鱼和小鱼
- 华为软件编程题:操作系统任务调度问题
- 小编程题--解决一维迷宫问题