算法极烂的一个,看看这个怎么写

蔡袅 2013-05-31 10:36:43
N>=P>=1 (N,P皆为整数)
将N分成P份,每份至少为1 求随机得到一组。
...全文
220 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
完美算法 2013-06-03
  • 打赏
  • 举报
回复

        public int[] list(int N, int P)
        {
            Random r = new Random();
            int[] result = new int[P];
            int j;

            //使分配的数至少为1;
            for (int i = 0; i < P; i++)
            {
                result[i] = 1;
            }
            
            //让下标为随机数,每次分配1,
            for (int i = 0; i < N - P; i++)
            {
                j = r.Next(P);
                result[j]++;
            }
            return result;
        }

djming1 2013-06-02
  • 打赏
  • 举报
回复
Random r = new Random(); 生成一个随机数,参数是最大值。第一组就是 N-(P-1),第二组减去第一组的数再算,最后一组就是剩下的[/size]
竹叶不知秋0_0 2013-06-02
  • 打赏
  • 举报
回复
得到P和N之后, 先生成P个1, 然后,N减去P后,在新的数的范围内随机, 将随机结果分别加到这P个数里头。
  • 打赏
  • 举报
回复
引用 5 楼 xx_mm 的回复:
可能我描述错了,还是你们理解错了 比如10这个数分成4份,每份至少为1 ,随便一组为2,1,3,4 13分成5份,则为3,4,2,2,4 很多种可能....
楼主这表达能力啊。。。 我的理解是这种 比如10这个数分成4份,每份至少有1个数 ,随便一组为2,1,3,4 7分成3份,则为3个 2个 2个 517,32,46 不知道你是不是想表达这个意思?
threenewbee 2013-06-01
  • 打赏
  • 举报
回复
你把我的代码仔细看明白,答案已经在里面了 var splitter = Enumerable.Range(1, n - 1).OrderBy(x => Guid.NewGuid()).ToList().Take(p - 1).OrderBy(x => x).ToArray(); 你的要求这一行就可以实现。
蔡袅 2013-06-01
  • 打赏
  • 举报
回复
引用 4 楼 wanghui0380 的回复:
额,这不需要啥算法,思维方式而已 既然必须有1个,优先保障他就ok。优先把每个“盒子”里随机放一个,剩下滴无所谓了,爱怎么放就怎么放,已经对结果木影响了 话说说到这份上,你自己应该可以写出来了
你的显得不随机了,我说的是每份至少1个。
蔡袅 2013-06-01
  • 打赏
  • 举报
回复
可能我描述错了,还是你们理解错了 比如10这个数分成4份,每份至少为1 ,随便一组为2,1,3,4 13分成5份,则为3,4,2,2,4 很多种可能....
wanghui0380 2013-06-01
  • 打赏
  • 举报
回复
额,这不需要啥算法,思维方式而已 既然必须有1个,优先保障他就ok。优先把每个“盒子”里随机放一个,剩下滴无所谓了,爱怎么放就怎么放,已经对结果木影响了 话说说到这份上,你自己应该可以写出来了
Code従業員 2013-06-01
  • 打赏
  • 举报
回复
随机生成的? 你反过来算不行么?随机生成每份数字,随机生成份数(P),将所有加起来(N)。
threenewbee 2013-05-31
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = 20;
            int p = 10;
            var data = Enumerable.Range(1, n).OrderBy(x => Guid.NewGuid()).ToArray();
            var splitter = Enumerable.Range(1, n - 1).OrderBy(x => Guid.NewGuid()).ToList().Take(p - 1).OrderBy(x => x).ToArray();
            var result = new int[] { 0 }.Concat(splitter).Zip(splitter.Concat(new int[] { n }), (x, y) => new { x, y }).Select(x => data.Skip(x.x).Take(x.y - x.x).ToArray());
            foreach (var item in result)
            {
                Console.WriteLine(string.Join(", ", item));
            }
        }
    }
}
4 1, 17, 20 13 9, 14, 12 10 3, 2, 16, 15 6, 18, 5 7 19 11, 8 Press any key to continue . . .
蔡袅 2013-05-31
  • 打赏
  • 举报
回复
期待大侠,神一般的解决办法。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧