好多鱼算法!

牛牛有一个鱼缸。鱼缸里面已经有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

C#:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp7
{
    class Program
    {
        static void Main(string[] args)
        {
            Test test = new Test();
            string RangeStr = Console.ReadLine();
            string[] Range = RangeStr.Split(' ');
            int MinSize = int.Parse(Range[0]);
            int MaxSize = int.Parse(Range[1]);
            int n = int.Parse(Console.ReadLine());
            int FishSzie = int.Parse(Console.ReadLine());  //这个为了方便测试偷懒偷懒没有写空格多次输入,要测试时请注意
            test.test(MinSize, MaxSize, n, FishSzie);             
        }
    }
    class Test
    {
        public void test(int MinSize, int MaxSize, int n, int FishSize)
        {
            ArrayList FishTank = new ArrayList();//鱼缸
            FishTank.Add(FishSize);//已放入的鱼
            for (int NewFishSize = MinSize; NewFishSize <= MaxSize; NewFishSize++)//对每种鱼的大小进行判定
            {
                bool add = true;//默认将一条新鱼放入鱼缸
                foreach (int Fish in FishTank)//遍历鱼缸里的鱼的大小的种类
                {
                    //如果新加的鱼大小大于鱼缸里已经存在的鱼并且新加的鱼的大小在已存在的鱼的2倍到10倍之间
                    if ((NewFishSize > Fish && (NewFishSize >= 2 * Fish && NewFishSize <= 10 * Fish)) ||
                        //或者新加的鱼大小于鱼缸里已经存在的鱼并且存在的鱼的大小在新加的鱼的2倍到10倍之间
                        (NewFishSize < Fish && (Fish >= 2 * NewFishSize && NewFishSize <= 10 * NewFishSize)))
                    {
                        add = false;  //判定不能放进鱼缸
                    }
                    else if (NewFishSize == Fish)//或者新加的鱼的大小等于已存在的鱼
                    {
                        add = false;  //可以放入鱼缸 不计算种类
                        n++; //鱼数量+1
                    }
                }
                if (add&&n<50)//add=true并且鱼的数量小于50  可以放入鱼缸
                {
                        FishTank.Add(NewFishSize);//放入鱼缸
                        n++;                    //鱼数量+1
                }      
              
            }
            Console.WriteLine(FishTank.Count);//输出鱼种类
            Console.WriteLine(n);              //输出鱼数量
        }
    }
}

测试用例  1 , 36    //范围
                 1             //数量
                3              //大小

结果        8        

   网上有一些答案为10      原因是它给的答案对大小为3的这一条鱼为参考做为计算的,不考虑后面的加进的鱼会不会互吃,指只考虑会不会把3给吃了或者被3吃!而未考虑到新加进来的鱼与后面再加入的鱼是否会互吃,鱼缸中最终的鱼大小为2,3,4,5,31,32,33,34,35,36,未考虑2,4,5之间互吃问题
但是这个为8的答案又似乎有些漏洞,最终该鱼缸中的鱼为2,3,31,32,33,34,35,36共八中大小的鱼,但是如果我不放入2的话,可以为3,4,5,31,32,33,34,35,36九种鱼,应该有更好的解决方案,待研究,求大佬解惑!


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值